1. 程式人生 > >Java開發之設計模式--策略模式(Strategy Pattern)

Java開發之設計模式--策略模式(Strategy Pattern)

模擬場景:

劉備要到江東娶老婆了,走之前諸葛亮給趙雲(伴郎)三個錦囊妙計,說是按天機拆開解決棘手問題,嘿,還別說,真是解決了大問題,搞到最後是周瑜陪了夫人又折兵呀,那咱們先看看這個場景是什麼樣子的。

先說這個場景中的要素:三個妙計,一個錦囊,一個趙雲,妙計是小亮同志給的,妙計是放置在錦囊裡,俗稱就是錦囊妙計嘛,那趙雲就是一個幹活的人,從錦囊中取出妙計,執行,然後獲勝。

類圖

這裡寫圖片描述

Java程式

  • 三個妙計是同一型別,那咱就寫個介面:
package com.zanelove.strategy;

/**
 * I'm glad to share my knowledge with you all.
 * 首先定一個策略介面,這是諸葛亮老人家給趙雲的三個錦囊妙計的介面 *
 */
public interface IStrategy { //每個錦囊妙計都是一個可執行的演算法 public void operate(); }
  • 三個妙計,三個實現類:

1.

package com.zanelove.strategy;

/**
 * I'm glad to share my knowledge with you all. 
 * 找喬國老幫忙,使孫權不能殺劉備
 */

public class BackBoor implements IStrategy {
    public void operate() {
        System.out.println("找喬國老幫忙,讓吳國太給孫權施加壓力"
); } }

2.

package com.zanelove.strategy;

/**
 * I'm glad to share my knowledge with you all. 
 * 求吳國太開個綠燈
 */

public class GivenGreenLight implements IStrategy {
    public void operate() {
        System.out.println("求吳國太開個綠燈,放行!");
    }
}

3.

package com.zanelove.strategy;

/**
 * I'm glad to share my knowledge with you all. 
 * 孫夫人斷後,擋住追兵
 */
public class BlockEnemy implements IStrategy { public void operate() { System.out.println("孫夫人斷後,擋住追兵"); } }
  • 三個妙計入錦囊:
package com.zanelove.strategy;

/**
* I'm glad to share my knowledge with you all. 
* 計謀有了,那還要有錦囊
*/

public class Context { 
    //建構函式,你要使用哪個妙計
    private IStrategy strategy;
    public Context(IStrategy strategy){
        this.strategy = strategy; 
    }

    //使用計謀了,看我出招了 
    public void operate(){
        this.strategy.operate(); 
    }
}

然後就是趙雲雄赳赳的揣著三個錦囊,拉著已步入老年行列的、還想著娶純情少女的、色迷迷的劉老爺子去入贅了,嗨,還別說,小亮的三個妙計還真是不錯,瞅瞅:

  • 趙雲出場,一個頂倆:
package com.zanelove.strategy;

/**
 * I'm glad to share my knowledge with you all. 
 */

public class ZhaoYun { 
    /**
     * 趙雲出場了,他根據諸葛亮給他的交代,依次拆開妙計
     */
    public static void main(String[] args) { 
        Context context;

        //剛剛到吳國的時候,拆第一個
        context = new Context(new BackDoor()); //拿到妙計
        context.operate(); //拆開執行 

        //劉備樂不思蜀了,拆第二個
        context = new Context(new GivenGreenLight());
        context.operate(); //執行了第二個錦囊了 

        //孫權的小兵追了,咋辦?拆第三個
        context = new Context(new BlockEnemy()); 
        context.operate(); //孫夫人退兵
    } 
}

策略模式優點:

演算法的使用和演算法本身解耦,即把變化的具體演算法封裝了起來。策略模式是除了繼承之外的一種彈性替代方案,如果你使用繼承定義了一個類,下面有部分的派生類,此時你會讓基類所困住,要想修改它特別不容易,而策略模式則可能通過組合不同的物件來改變行為。

策略模式缺點:

1、 雖說客戶程式碼無須關心各個策略是如何實現的,但是它們還是要知道有多少種策略實現,具體功能情況,這樣才可以根據需要使用哪個策略。
2、 使用策略模式後出現很多小類。

就這三招,搞的周郎是“陪了夫人又折兵”呀!這就是策略模式,高內聚低耦合的特點也表現出來了, 還有一個就是擴充套件性,也就是 OCP 原則,策略類可以繼續增加下去,只要修改 Context.java 就可以了,這 個不多說了,自己領會吧。