最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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ò)支付的功能。現(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ā)光!");
}
}
//———測試類———————————–
public class Test {
public static void main(String[] args) {
System.out.println("———測試———–");
Bank duck=null;
duck=new EarthBank();
duck.serviceStyle();
duck.payMoney();
duck.netBank();
System.out.println("———測試———–");
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、 相對于繼承代碼更好地得到復(fù)用,同時(shí)可以避免使用多重條件轉(zhuǎn)移語句。

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

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

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

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

相關(guān)文章

  • Java實(shí)現(xiàn)將PPT轉(zhuǎn)為OFD過程詳解

    Java實(shí)現(xiàn)將PPT轉(zhuǎn)為OFD過程詳解

    本文將通過Java后端程序代碼展示如何實(shí)現(xiàn)將PPT幻燈片轉(zhuǎn)成OFD格式,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)或工作有一定的幫助,需要的可以參考一下
    2022-01-01
  • Java實(shí)現(xiàn)word/pdf轉(zhuǎn)html并在線預(yù)覽

    Java實(shí)現(xiàn)word/pdf轉(zhuǎn)html并在線預(yù)覽

    這篇文章主要為大家詳細(xì)介紹了如何利用Java語言實(shí)現(xiàn)word、pdf文件轉(zhuǎn)html并在線預(yù)覽的功能,文中的示例代碼講解詳細(xì),需要的可以參考一下
    2023-05-05
  • 淺談Java中的private方法是否可以被代理

    淺談Java中的private方法是否可以被代理

    這篇文章主要介紹了淺談Java中的private方法是否可以被代理,在?Java?8之前,接口可以有常量變量和抽象方法,我們不能在接口中提供方法實(shí)現(xiàn),如果我們要提供抽象方法和非抽象方法(方法與實(shí)現(xiàn))的組合,那么我們就得使用抽象類,需要的朋友可以參考下
    2023-12-12
  • Java趣味練習(xí)題之輸出兩個(gè)日期之間的相隔天數(shù)

    Java趣味練習(xí)題之輸出兩個(gè)日期之間的相隔天數(shù)

    本篇文章介紹了我看到的一個(gè)趣味小題目,怎么求得兩個(gè)日期之間相隔的天數(shù),以及解決該題目的過程及思路,通讀本篇對大家的學(xué)習(xí)或工作具有一定的價(jià)值,需要的朋友可以參考下
    2021-10-10
  • springboot項(xiàng)目mysql-connector-java默認(rèn)版本如何查看

    springboot項(xiàng)目mysql-connector-java默認(rèn)版本如何查看

    這篇文章主要介紹了springboot項(xiàng)目mysql-connector-java默認(rèn)版本如何查看問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • spring framework源碼調(diào)試技巧

    spring framework源碼調(diào)試技巧

    這篇文章給大家介紹了spring-framework源碼調(diào)試方法,可以直接將最新代碼clone到本地,如果想在代碼做一些注釋,也可以Fork到自己的倉庫。本文采用Fork的方式,并添加了測試module,感興趣的朋友一起看看吧
    2021-10-10
  • Java使用XML與注解方式實(shí)現(xiàn)CRUD操作代碼

    Java使用XML與注解方式實(shí)現(xiàn)CRUD操作代碼

    MyBatis提供了靈活的配置和使用方式,使得數(shù)據(jù)庫操作更加簡潔和高效,通過本文,我們介紹了如何使用MyBatis框架,通過XML映射文件和注解兩種方式來實(shí)現(xiàn)數(shù)據(jù)庫的增刪改查操作,感興趣的朋友跟隨小編一起看看吧
    2024-02-02
  • 在jmeter的beanshell中用java獲取系統(tǒng)當(dāng)前時(shí)間的簡單實(shí)例

    在jmeter的beanshell中用java獲取系統(tǒng)當(dāng)前時(shí)間的簡單實(shí)例

    這篇文章介紹了在jmeter的beanshell中用java獲取系統(tǒng)當(dāng)前時(shí)間的簡單實(shí)例,有需要的朋友可以參考一下
    2013-09-09
  • Java實(shí)現(xiàn)選擇排序

    Java實(shí)現(xiàn)選擇排序

    這篇文章主要介紹了Java實(shí)現(xiàn)選擇排序,把一列數(shù)組按從小到大或從大到小排序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 教你使用Java實(shí)現(xiàn)掃雷小游戲(最新完整版)

    教你使用Java實(shí)現(xiàn)掃雷小游戲(最新完整版)

    本文給大家介紹使用Java實(shí)現(xiàn)掃雷小游戲,本程序封裝了五個(gè)類,分別是主類GameWin類,繪制底層地圖和繪制頂層地圖的類MapBottom類和MapTop類,繪制底層數(shù)字的類BottomNum類,以及初始化地雷的BottomRay類和工具GameUtil類,用于存靜態(tài)參數(shù)和方法,感興趣的朋友一起看看吧
    2022-05-05

最新評論

蒙城县| 河源市| 阿拉善左旗| 临沧市| 通道| 周至县| 枣阳市| 巴东县| 澎湖县| 龙州县| 荣成市| 丰顺县| 西青区| 芒康县| 嘉黎县| 阿合奇县| 博乐市| 内丘县| 桃园市| 越西县| 永春县| 湖口县| 来安县| 旬阳县| 临安市| 蒙山县| 广平县| 玉溪市| 彩票| 商水县| 石楼县| 霍林郭勒市| 乌海市| 基隆市| 丽江市| 永春县| 罗源县| 耿马| 方正县| 牟定县| 宣威市|