Java設計模式(一):策略設計模式
阿新 • • 發佈:2018-12-24
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()