1. 程式人生 > >Java設計模式(一):策略設計模式

Java設計模式(一):策略設計模式

1. 應用場景

當系統能在幾種演算法中快速地切換,或系統中有一些類,它們僅行為不同時,或系統中存在多重條件選擇語句時,可以考慮採用策略模式。找出應用中可能需要變化之處,把它們獨立出來,不要和那些不需要變化的程式碼混在一起。

2. 概念

定義了演算法族,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化獨立於使用算的客戶。

3. Class Diagram

  • Strategy 介面定義了一個演算法族,它們都實現了 behavior() 方法。
  • Context 是使用到該演算法族的類,其中的 doSomething() 方法會呼叫 behavior(),setStrategy(Strategy) 方法可以動態地改變 strategy 物件,也就是說能動態地改變 Context 所使用的演算法。

在這裡插入圖片描述

4.與狀態模式的比較

狀態模式的類圖和策略模式類似,並且都是能夠動態改變物件的行為。但是狀態模式是通過狀態轉移來改變 Context 所組合的 State 物件,而策略模式是通過 Context 本身的決策來改變組合的 Strategy 物件。所謂的狀態轉移,是指 Context 在執行過程中由於一些條件發生改變而使得 State 物件發生改變,注意必須要是在執行過程中。

狀態模式主要是用來解決狀態轉移的問題,當狀態發生轉移了,那麼 Context 物件就會改變它的行為;而策略模式主要是用來封裝一組可以互相替代的演算法族,並且可以根據需要動態地去替換 Context 使用的演算法。

5. Implementation

設計一個鴨子,它可以動態地改變叫聲。這裡的演算法族是鴨子的叫聲行為。

public interface QuackBehavior {
    void quack();
}
public class Quack implements QuackBehavior {
    @Override
    public void quack() {
        System.out.println("quack!");
    }
}
public class Squeak implements QuackBehavior{
    @Override
public void quack() { System.out.println("squeak!"); } } public class Duck { private QuackBehavior quackBehavior; public void performQuack() { if (quackBehavior != null) { quackBehavior.quack(); } } public void setQuackBehavior(QuackBehavior quackBehavior) { this.quackBehavior = quackBehavior; } } public class Client { public static void main(String[] args) { Duck duck = new Duck(); duck.setQuackBehavior(new Squeak()); duck.performQuack(); duck.setQuackBehavior(new Quack()); duck.performQuack(); } } 執行結果: squeak! quack!

6. JDK

  • java.util.Comparator#compare()
  • javax.servlet.http.HttpServlet
  • javax.servlet.Filter#doFilter()