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

詳解Java設計模式編程中的策略模式

 更新時間:2016年02月17日 10:19:53   作者:卡奴達摩  
這篇文章主要介紹了詳解Java設計模式編程中的策略模式,策略模式強調對對象的封裝使用,比如文中舉的錦囊妙計的例子便很生動,需要的朋友可以參考下

定義:定義一組算法,將每個算法都封裝起來,并且使他們之間可以互換。
類型:行為類模式
類圖:

2016217101750404.jpg (473×231)

策略模式是對算法的封裝,把一系列的算法分別封裝到對應的類中,并且這些類實現(xiàn)相同的接口,相互之間可以替換。在前面說過的行為類模式中,有一種模式也是關注對算法的封裝——模版方法模式,對照類圖可以看到,策略模式與模版方法模式的區(qū)別僅僅是多了一個單獨的封裝類Context,它與模版方法模式的區(qū)別在于:在模版方法模式中,調用算法的主體在抽象的父類中,而在策略模式中,調用算法的主體則是封裝到了封裝類Context中,抽象策略Strategy一般是一個接口,目的只是為了定義規(guī)范,里面一般不包含邏輯。其實,這只是通用實現(xiàn),而在實際編程中,因為各個具體策略實現(xiàn)類之間難免存在一些相同的邏輯,為了避免重復的代碼,我們常常使用抽象類來擔任Strategy的角色,在里面封裝公共的代碼,因此,在很多應用的場景中,在策略模式中一般會看到模版方法模式的影子。
 
策略模式的結構
封裝類:也叫上下文,對策略進行二次封裝,目的是避免高層模塊對策略的直接調用。
抽象策略:通常情況下為一個接口,當各個實現(xiàn)類中存在著重復的邏輯時,則使用抽象類來封裝這部分公共的代碼,此時,策略模式看上去更像是模版方法模式。
具體策略:具體策略角色通常由一組封裝了算法的類來擔任,這些類之間可以根據(jù)需要自由替換。

應用場景舉例:
 
劉備要到江東娶老婆了,走之前諸葛亮給趙云(伴郎)三個錦囊妙計,說是按天機拆開能解決棘手問題,嘿,還別說,真解決了大問題,搞到最后是周瑜陪了夫人又折兵,那咱們先看看這個場景是什么樣子的。
 
先說說這個場景中的要素:三個妙計,一個錦囊,一個趙云,妙計是亮哥給的,妙計放在錦囊里,俗稱就是錦囊妙計嘛,那趙云就是一個干活的人,從錦囊取出妙計,執(zhí)行,然后獲勝。用java程序怎么表現(xiàn)這些呢?
那我們先來看看圖?

2016217101820162.jpg (859×531)

三個妙計是同一類型的東西,那咱就寫個接口:

package com.yangguangfu.strategy; 
/** 
 * 
 * @author trygf521@126.com:阿福 
 * 首先定義一個策略接口,這是諸葛亮老人家給趙云的三個錦囊妙計的接口。 
 */ 
public interface IStrategy { 
  //每個錦囊妙計都是一個可執(zhí)行的算法。 
  public void operate(); 
 
} 

 
然后再寫三個實現(xiàn)類,有三個妙計嘛:
 
妙計一:初到吳國:

package com.yangguangfu.strategy; 
/** 
 * 
 * @author trygf521@126.com:阿福 
 * 找喬國老幫忙,使孫權不能殺劉備。 
 */ 
public class BackDoor implements IStrategy { 
 
  @Override 
  public void operate() { 
    System.out.println("找喬國老幫忙,讓吳國太給孫權施加壓力,使孫權不能殺劉備..."); 
  } 
 
} 

 
妙計二:求吳國太開個綠燈,放行:

package com.yangguangfu.strategy; 
/** 
 * 
 * @author trygf521@126.com:阿福 
 * 求吳國太開個綠燈。 
 */ 
public class GivenGreenLight implements IStrategy { 
 
  @Override 
  public void operate() { 
    System.out.println("求吳國太開個綠燈,放行!"); 
     
  } 
 
} 

 妙計三:孫夫人斷后,擋住追兵:

package com.yangguangfu.strategy; 
/** 
 * 
 * @author trygf521@126.com:阿福 
 * 孫夫人斷后,擋住追兵。 
 */ 
public class BlackEnemy implements IStrategy { 
 
  @Override 
  public void operate() { 
    System.out.println("孫夫人斷后,擋住追兵..."); 
 
  } 
 
} 

 
好了,大家看看,三個妙計是有了,那需要有個地方放妙計啊,放錦囊里:

package com.yangguangfu.strategy; 
/** 
 * 
 * @author trygf521@126.com:阿福 
 * 
 */ 
public class Context { 
   
  private IStrategy strategy; 
  //構造函數(shù),要你使用哪個妙計 
  public Context(IStrategy strategy){ 
    this.strategy = strategy; 
  } 
   
  public void operate(){ 
    this.strategy.operate(); 
  } 
 
} 

 
然后就是趙云雄赳赳的揣著三個錦囊,拉著已步入老年行列,還想著娶純情少女的,色咪咪的劉備老爺子去入贅了,嗨,還別說,亮哥的三個妙計還真不錯,瞧瞧:

package com.yangguangfu.strategy; 
 
public class ZhaoYun { 
 
  /** 
   * 趙云出場了,他根據(jù)諸葛亮給他的交代,依次拆開妙計 
   */ 
  public static void main(String[] args) { 
    Context context; 
     
    //剛到吳國的時候拆開第一個 
    System.out.println("----------剛剛到吳國的時候拆開第一個---------------"); 
    context = new Context(new BackDoor()); 
    context.operate();//拆開執(zhí)行 
    System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n"); 
     
    //當劉備樂不思蜀時,拆開第二個 
    System.out.println("----------劉備樂不思蜀,拆第二個了---------------"); 
    context = new Context(new GivenGreenLight()); 
    context.operate();//拆開執(zhí)行 
    System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n"); 
     
    //孫權的小追兵了,咋辦?拆開第三個錦囊 
    System.out.println("----------孫權的小追兵了,咋辦?拆開第三個錦囊---------------"); 
    context = new Context(new BlackEnemy()); 
    context.operate();//拆開執(zhí)行 
    System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n"); 
  } 
 
} 

 
策略模式的優(yōu)缺點
       策略模式的主要優(yōu)點有:
策略類之間可以自由切換,由于策略類實現(xiàn)自同一個抽象,所以他們之間可以自由切換。
易于擴展,增加一個新的策略對策略模式來說非常容易,基本上可以在不改變原有代碼的基礎上進行擴展。
避免使用多重條件,如果不使用策略模式,對于所有的算法,必須使用條件語句進行連接,通過條件判斷來決定使用哪一種算法,在上一篇文章中我們已經提到,使用多重條件判斷是非常不容易維護的。
       策略模式的缺點主要有兩個:
維護各個策略類會給開發(fā)帶來額外開銷,可能大家在這方面都有經驗:一般來說,策略類的數(shù)量超過5個,就比較令人頭疼了。
必須對客戶端(調用者)暴露所有的策略類,因為使用哪種策略是由客戶端來決定的,因此,客戶端應該知道有什么策略,并且了解各種策略之間的區(qū)別,否則,后果很嚴重。例如,有一個排序算法的策略模式,提供了快速排序、冒泡排序、選擇排序這三種算法,客戶端在使用這些算法之前,是不是先要明白這三種算法的適用情況?再比如,客戶端要使用一個容器,有鏈表實現(xiàn)的,也有數(shù)組實現(xiàn)的,客戶端是不是也要明白鏈表和數(shù)組有什么區(qū)別?就這一點來說是有悖于迪米特法則的。
 
適用場景
        做面向對象設計的,對策略模式一定很熟悉,因為它實質上就是面向對象中的繼承和多態(tài),在看完策略模式的通用代碼后,我想,即使之前從來沒有聽說過策略模式,在開發(fā)過程中也一定使用過它吧?至少在在以下兩種情況下,大家可以考慮使用策略模式,
幾個類的主要邏輯相同,只在部分邏輯的算法和行為上稍有區(qū)別的情況。
有幾種相似的行為,或者說算法,客戶端需要動態(tài)地決定使用哪一種,那么可以使用策略模式,將這些算法封裝起來供客戶端調用。
       策略模式是一種簡單常用的模式,我們在進行開發(fā)的時候,會經常有意無意地使用它,一般來說,策略模式不會單獨使用,跟模版方法模式、工廠模式等混合使用的情況比較多。

相關文章

  • SpringBoot自定義maven-plugin插件整合asm代碼插樁

    SpringBoot自定義maven-plugin插件整合asm代碼插樁

    本文主要介紹了SpringBoot自定義maven-plugin插件整合asm代碼插樁,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • java模擬ATM功能(控制臺連接Mysql數(shù)據(jù)庫)

    java模擬ATM功能(控制臺連接Mysql數(shù)據(jù)庫)

    這篇文章主要介紹了java模擬ATM功能,控制臺連接Mysql數(shù)據(jù)庫,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • Java抽象類、繼承及多態(tài)和適配器的實現(xiàn)代碼

    Java抽象類、繼承及多態(tài)和適配器的實現(xiàn)代碼

    這篇文章主要介紹了Java抽象類、繼承及多態(tài)和適配器的實現(xiàn),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-06-06
  • java Tapestry4.1.2入門說明教程

    java Tapestry4.1.2入門說明教程

    不必關心鏈接!不必關心請求(http request)到了哪里!不必關心響應(http response)要轉向哪里!Tapestry構建于底層的request-resonse模式,基于Servlet技術,抽象出面向組件開發(fā)的模型。Tapestry關心的是:頁面、組件、事件、對象、方法、屬性!
    2008-11-11
  • 獲取Java加載器和類完整結構的方法分享

    獲取Java加載器和類完整結構的方法分享

    這篇文章主要為大家詳細介紹了獲取Java加載器和類完整結構的方法,文中的示例代碼講解詳細,對我們學習Java有一定的幫助,需要的可以參考一下
    2022-12-12
  • 詳細聊一聊java語言中的package和import機制

    詳細聊一聊java語言中的package和import機制

    這篇文章主要給大家介紹了關于java語言中package和import機制的相關資料,Java中的package是指將相關的類組織在一起的一種機制,它可以用來避免命名沖突,也可以方便地管理和維護代碼,需要的朋友可以參考下
    2024-01-01
  • @Accessors(chain = true)注解報錯的解決方案

    @Accessors(chain = true)注解報錯的解決方案

    這篇文章主要介紹了@Accessors(chain = true)注解報錯的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java后端實現(xiàn)短鏈接生成功能

    Java后端實現(xiàn)短鏈接生成功能

    短鏈接生成主要在于把指定的接口和參數(shù)實現(xiàn)加密生成比較短的字符串,再進行拼接通過指定的域名或者ip實現(xiàn)鏈接的跳轉,下面我們來看看如何使用Java實現(xiàn)這一功能吧
    2025-03-03
  • 使用Java獲取linux和window序列號

    使用Java獲取linux和window序列號

    這篇文章主要為大家詳細介紹了如何使用Java獲取Windows和Linux系統(tǒng)上的CPU序列號、磁盤、mac地址等信息,感興趣的小伙伴可以跟隨小編一起學習一下
    2024-01-01
  • mybatis動態(tài)生成sql語句的實現(xiàn)示例

    mybatis動態(tài)生成sql語句的實現(xiàn)示例

    在MyBatis中,動態(tài)SQL是一個非常重要的特性,它允許我們根據(jù)條件動態(tài)地生成SQL語句,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-11-11

最新評論

抚顺市| 晋江市| 三明市| 秭归县| 清河县| 常宁市| 清河县| 彝良县| 左贡县| 常熟市| 射洪县| 时尚| 荃湾区| 大关县| 酒泉市| 阳春市| 锡林浩特市| 当阳市| 剑阁县| 永善县| 资阳市| 亳州市| 肇源县| 集贤县| 晋城| 共和县| 泰和县| 利辛县| 天祝| 武陟县| 分宜县| 兰州市| 东乡县| 澄城县| 榆树市| 疏勒县| 临沧市| 长兴县| 德令哈市| 普定县| 唐山市|