折騰Java設計模式之策略模式

博客原文地址html

簡介

在策略模式(Strategy Pattern)中,一個類的行爲或其算法能夠在運行時更改。這種類型的設計模式屬於行爲型模式。簡單理解就是一組算法,能夠互換,再簡單點策略就是封裝算法。java

意圖 定義一系列的算法,把它們一個個封裝起來, 而且使它們可相互替換。git

主要解決 在有多種算法類似的狀況下,使用 if...else 所帶來的複雜和難以維護。github

什麼時候使用 一個系統有許多許多類,而區分它們的只是他們直接的行爲。算法

如何解決 將這些算法封裝成一個一個的類,任意地替換。設計模式

主要角色ide

  • 上下文Context,擁有一個Strategy的引用
  • 抽象策略Strategy,每每是一個接口(佔大部分狀況)或者抽象類,一般提供各類具體策略的接口
  • 具體策略,這就是重點了,封裝了各類具體的算法

UMLthis

img

應用實例spa

  • 諸葛亮的錦囊妙計,每個錦囊就是一個策略;
  • 旅行的出遊方式,選擇騎自行車、坐汽車,每一種旅行方式都是一個策略;
  • JAVA AWT 中的 LayoutManager;

優勢 一、算法能夠自由切換。 二、避免使用多重條件判斷。 三、擴展性良好。設計

缺點 一、策略類會增多。 二、全部策略類都須要對外暴露。

使用場景

  1. 若是在一個系統裏面有許多類,它們之間的區別僅在於它們的行爲,那麼使用策略模式能夠動態地讓一個對象在許多行爲中選擇一種行爲。
  2. 一個系統須要動態地在幾種算法中選擇一種。
  3. 若是一個對象有不少的行爲,若是不用恰當的模式,這些行爲就只好使用多重的條件選擇語句來實現。

注意事項: 若是一個系統的策略多於四個,就須要考慮使用混合模式,解決策略類膨脹的問題。

項目描述

跳轉到個人策略模式GitHub

1.操做行爲

simple1包,主要對操做行爲包裝了加減乘除方法。

@Slf4j
public class Application {

    public static void main(String[] args) {
        Context context = new Context(new AddStrategy());
        log.info("10 + 5 = {}", context.executeStrategy(10, 5));

        context.setStrategy(new SubstractStrategy());
        log.info("10 - 5 = {}", context.executeStrategy(10, 5));

        context.setStrategy(new MultiplyStrategy());
        log.info("10 * 5 = {}", context.executeStrategy(10, 5));

        context.setStrategy(new DivideStrategy());
        log.info("10 / 5 = {}", context.executeStrategy(10, 5));
    }
}
複製代碼

執行結果

img

2.出現方式

simple2包描述,主要對出行方式的包裝,包裝了3種出行方式,

執行類

public class TravelApplication {

    public static void main(String[] args) {
        Context context = new Context(new BusStrategy());
        context.executeStrategy("老王");

        context.setStrategy(new BicycleStrategy());
        context.executeStrategy("老張");

        context.setStrategy(new WalkStrategy());
        context.executeStrategy("老李");
    }
}
複製代碼

執行結果

image-20181222104657926

策略上下文

@Data
public class Context {

    private Strategy strategy;

    public Context(Strategy strategy) {
        this.strategy = strategy;
    }

    /** * 出行 * * @return */
    public void executeStrategy(String name) {
        strategy.travel(name);
    }

}
複製代碼

抽象策略

public interface Strategy {

    /** * 出現方法 * * @return */
    void travel(String name);
}
複製代碼

參考

策略模式

維基裏的策略模式

南鄉清水的實際項目運用之Strategy模式

相關文章
相關標籤/搜索