欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java經(jīng)典設(shè)計(jì)模式之策略模式原理與用法詳解

 更新時(shí)間:2017年08月07日 09:03:54   作者:遲做總比不做強(qiáng)  
這篇文章主要介紹了Java經(jīng)典設(shè)計(jì)模式之策略模式,簡單說明了策略模式的概念、原理并結(jié)合實(shí)例形式分析了java策略模式的具有用法與相關(guān)注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了Java經(jīng)典設(shè)計(jì)模式之策略模式。分享給大家供大家參考,具體如下:

策略模式指:策略模式指將程序中可變部分抽象分離成一系列的算法,并將每一個(gè)算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨(dú)立于使用它的客戶而獨(dú)立變化。

策略模式一般由下面三部分組成:

1. 抽象策略角色: 策略類,通常由一個(gè)接口或者抽象類實(shí)現(xiàn)。
2. 具體策略角色:包裝了相關(guān)的算法和行為。
3. 環(huán)境角色:持有某一個(gè)策略類的引用,客戶端調(diào)用。

策略模式設(shè)計(jì)原則:

1. 把程序中需要變化的部分抽離出來,獨(dú)立于不變的部分
2. 面向接口編程,而不是面向?qū)崿F(xiàn)編程,多作組合 ,少用繼承。(組合 :在類中增加一個(gè)私有域,引用另外一個(gè)已經(jīng)有的類的實(shí)例,通過調(diào)用實(shí)例的方法從而獲得新的功能)

應(yīng)用舉例,以銀行為例,可能有點(diǎn)不恰當(dāng)

比如我們應(yīng)用要接入銀行支付功能。我們都知道,銀行都有支付功能,隨著技術(shù)的發(fā)展,銀行具有了開通網(wǎng)絡(luò)支付的功能?,F(xiàn)在我們遇到的問題是,我們要增加支付的銀行,但是有的銀行還沒有開通網(wǎng)絡(luò)銀行,有的已經(jīng)開通了,而且也要把原有接入 的銀行添加上網(wǎng)絡(luò)銀行功能(如果已經(jīng)開通的話)。

//銀行基類,為了適應(yīng)變化,增加了網(wǎng)絡(luò)支付處理的策略處理接口BankStrategy
public abstract class Bank {
private BankStrategy mBankStrategy;
public void setmStrategy(BankStrategy mStrategy) {
this.mBankStrategy = mStrategy;
}
public void payMoney() {
System.out.println("我具有支付功能");// 所有銀行共同的特征
}
public abstract void serviceStyle();// 但每個(gè)銀行有不同的服務(wù)方法(比的就是服務(wù)),具體的子類實(shí)現(xiàn)
public void netBank(){//開通網(wǎng)上銀行
mBankStrategy.netPay();
}
}
//———-銀行策略接口———————————
public interface BankStrategy {
void netPay();// 添加網(wǎng)絡(luò)支付功能
}
//————–增加開通網(wǎng)絡(luò)支付的策略實(shí)現(xiàn)類————
public class CanNetBank implements BankStrategy {
@Override
public void netPay() {
System.out.println("我已經(jīng)開通網(wǎng)絡(luò)支付功能");
}
}
//————–也有不開通網(wǎng)絡(luò)支付的銀行—————
public class NoNetBank implements BankStrategy {
@Override
public void netPay() {
System.out.println("我不開通網(wǎng)絡(luò)銀行,咋的!");
}
}
//——-地球銀行:現(xiàn)在開通網(wǎng)絡(luò)支付——————
public class EarthBank extends Bank {
public EarthBank(){
super();
super.setmStrategy(new CanNetBank());//這里就實(shí)現(xiàn)了網(wǎng)絡(luò)支付
}
@Override
public void serviceStyle() {
System.out.println("我的服務(wù)在事個(gè)地球上是最好的!");
}
}
//——–太陽銀行,說離我們太遠(yuǎn)了,不開通網(wǎng)絡(luò)銀行——————-
public class SunBank extends Bank {
public SunBank(){
super();
super.setmStrategy(new NoNetBank());//這里就不開通了(當(dāng)然可不調(diào)用 ,只是告訴下實(shí)現(xiàn)方法)
}
@Override
public void serviceStyle() {
System.out.println("我的服務(wù)像金子一樣發(fā)光!");
}
}
//———測(cè)試類———————————–
public class Test {
public static void main(String[] args) {
System.out.println("———測(cè)試———–");
Bank duck=null;
duck=new EarthBank();
duck.serviceStyle();
duck.payMoney();
duck.netBank();
System.out.println("———測(cè)試———–");
duck=new SunBank();
duck.serviceStyle();
duck.payMoney();
duck.netBank();
}
}

結(jié)果打印

策略模式的優(yōu)點(diǎn):

1、 提供了管理相關(guān)的算法策略類,恰當(dāng)使用繼承可以把公共的代碼轉(zhuǎn)移到父類里面,避免重復(fù)的代碼,使得架構(gòu)也更加靈活。
2、 提供了可以替換繼承關(guān)系的辦法(組合)。繼承也可以處理多種算法或行為,但算法或行為的環(huán)境類就可能會(huì)有一些子類,每一個(gè)子類提供一個(gè)不同的算法或行為。這樣一來算法或行為的使用者就和算法或行為本身混在一起。使得動(dòng)態(tài)改變算法變得復(fù)雜甚至不可行,也不符合開閉原則。
3、 相對(duì)于繼承代碼更好地得到復(fù)用,同時(shí)可以避免使用多重條件轉(zhuǎn)移語句。

策略模式的缺點(diǎn):

1、客戶代碼需要了解個(gè)策略實(shí)現(xiàn)的細(xì)節(jié),只適用于客戶端知道所有的算法或行為的情況。
2、 策略模式造成很多的策略類,每個(gè)具體策略類都會(huì)產(chǎn)生一個(gè)新類,增加了對(duì)象的數(shù)目。

更多java相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Java數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Java操作DOM節(jié)點(diǎn)技巧總結(jié)》、《Java文件與目錄操作技巧匯總》和《Java緩存操作技巧匯總

希望本文所述對(duì)大家java程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • Java操作Redis2種方法代碼詳解

    Java操作Redis2種方法代碼詳解

    這篇文章主要介紹了Java操作Redis2種方法代碼詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • 詳解Spring容器的使用流程

    詳解Spring容器的使用流程

    今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識(shí),文章圍繞著Spring容器的使用流程展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Java通過正則表達(dá)式獲取字符串中數(shù)字的方法示例

    Java通過正則表達(dá)式獲取字符串中數(shù)字的方法示例

    最近工作中遇到了一個(gè)需求,需要利用java獲取字符串中的數(shù)字,嘗試幾種方法后發(fā)現(xiàn)利用正則表達(dá)式實(shí)現(xiàn)最為方法,下面這篇文章就主要介紹了Java通過正則表達(dá)式獲取字符串中數(shù)字的方法,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考下。
    2017-03-03
  • java實(shí)現(xiàn)文件的上傳功能

    java實(shí)現(xiàn)文件的上傳功能

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)文件的上傳功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • SpringBoot基于AbstractRoutingDataSource實(shí)現(xiàn)多數(shù)據(jù)源動(dòng)態(tài)切換

    SpringBoot基于AbstractRoutingDataSource實(shí)現(xiàn)多數(shù)據(jù)源動(dòng)態(tài)切換

    本文主要介紹了SpringBoot基于AbstractRoutingDataSource實(shí)現(xiàn)多數(shù)據(jù)源動(dòng)態(tài)切換,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • Java 實(shí)戰(zhàn)項(xiàng)目錘煉之仿天貓網(wǎng)上商城的實(shí)現(xiàn)流程

    Java 實(shí)戰(zhàn)項(xiàng)目錘煉之仿天貓網(wǎng)上商城的實(shí)現(xiàn)流程

    讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實(shí)戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用java+jsp+servlet+mysql+ajax實(shí)現(xiàn)一個(gè)仿天貓網(wǎng)上商城項(xiàng)目,大家可以在過程中查缺補(bǔ)漏,提升水平
    2021-11-11
  • Java?ConcurrentHashMap的源碼分析詳解

    Java?ConcurrentHashMap的源碼分析詳解

    ConcurrentHashMap(CHM)是日常開發(fā)中使用頻率非常高的一種數(shù)據(jù)結(jié)構(gòu),想對(duì)于普通的HashMap,CHM提供了線程安全的讀寫,CHM里面使用了許多比較精妙的優(yōu)化&操作。本文主要對(duì)CHM的整體結(jié)構(gòu)、初始化,查找,插入等做分析
    2023-03-03
  • java實(shí)現(xiàn)簡單的五子棋游戲

    java實(shí)現(xiàn)簡單的五子棋游戲

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡單的五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Java深入淺出掌握SpringBoot之MVC自動(dòng)配置原理篇

    Java深入淺出掌握SpringBoot之MVC自動(dòng)配置原理篇

    在進(jìn)行項(xiàng)目編寫前,我們還需要知道一個(gè)東西,就是SpringBoot對(duì)我們的SpringMVC還做了哪些配置,包括如何擴(kuò)展,如何定制,只有把這些都搞清楚了,我們?cè)谥笫褂貌艜?huì)更加得心應(yīng)手
    2021-10-10
  • Java多線程編程之Lock用法實(shí)例

    Java多線程編程之Lock用法實(shí)例

    這篇文章主要介紹了Java多線程編程之Lock用法實(shí)例,本文直接給出代碼實(shí)例,需要的朋友可以參考下
    2015-05-05

最新評(píng)論