您的設計模式——策略模式【Strategy Pattern 】

劉備要到江東娶老婆了,走之前諸葛亮給趙雲(伴郎)三個錦囊妙計,說是按天機拆開解決棘手問題,

嘿,還別說,真是解決了大問題,搞到最後是周瑜陪了夫人又折兵呀,那咱們先看看這個場景是什麼樣子
的。
先說這個場景中的要素:三個妙計,一個錦囊,一個趙雲,妙計是小亮同志給的,妙計是放置在錦囊
裏,俗稱就是錦囊妙計嘛,那趙雲就是一個幹活的人,從錦囊中取出妙計,執行,然後獲勝,用 JAVA 程序
怎麼表現這個呢?我們先看類圖

這裏寫圖片描述

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

package com.alex.patterns.strategy;

/**
 * 
 * @author Alex
 *首先定義一個策略藉口,這是諸葛亮老人家給趙雲3個錦囊妙計的接口
 *
 */
public interface IStrategy {

    //每個錦囊妙計都是一個可執行的算法
    public void operate();
}

然後再寫三個實現類,有三個妙計嘛:

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

/**
 * @author Alex 求吳國太開個綠燈
 */
public class GivenGreenLight implements IStrategy {
    public void operate() {
        System.out.println("求吳國太開個綠燈,放行!");
    }
}
package com.alex.patterns.strategy;

/**
 * @author Alex 
 * 孫夫人斷後,擋住追兵
 */
public class BlockEnemy implements IStrategy {
    public void operate() {
        System.out.println("孫夫人斷後,擋住追兵");
    }
}

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

package com.alex.patterns.strategy;

/**
 * @author Alex 
 * 計謀有了,那還要有錦囊
 */
public class Context {
    // 構造函數,你要使用那個妙計
    private IStrategy straegy;

    public Context(IStrategy strategy) {
        this.straegy = strategy;
    }

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

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

package com.alex.patterns.strategy;

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

        // 剛剛到吳國的時候拆第一個
        System.out.println("-----------剛剛到吳國的時候拆第一個-------------");
        context = new Context(new BackDoor()); // 拿到妙計
        context.operate(); // 拆開執行
        System.out.println("\n\n");
        // 劉備樂不思蜀了,拆第二個了
        System.out.println("-----------劉備樂不思蜀了,拆第二個了-------------");
        context = new Context(new GivenGreenLight());
        context.operate(); // 執行了第二個錦囊了
        System.out.println("\n\n");
        // 孫權的小兵追了,咋辦?拆第三個
        System.out.println("-----------孫權的小兵追了,咋辦?拆第三個-------------");
        context = new Context(new BlockEnemy());
        context.operate(); // 孫夫人退兵
        System.out.println("\n\n");
        /*
         * 問題來了:趙雲實際不知道是那個策略呀,他只知道拆第一個錦囊, 而不知道是BackDoor這個妙計,咋辦?
         * 似乎這個策略模式已經把計謀名稱寫出來了
         *
         * 錯! BackDoor、 GivenGreenLight、 BlockEnemy只是一個代碼, 你寫成first、 second、
         * third,沒人會說你錯!
         *
         * 策略模式的好處就是:體現了高內聚低耦合的特性呀,缺點嘛,這個那個,我回去再查查
         */
    }
}

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

注:本文參考PDF《您的設計模式》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章