Java設計模式:策略模式
阿新 • • 發佈:2018-12-23
下面是一個有關於策略模式的故事。假設Mike在開車的時候,會很頻繁的加速,有一天因為超速他被一個警察攔下來了。有可能這個警察會比較友好,沒開任何罰單就讓Mike把車開走了。(我們把這型別的警察稱之為“NicePolice”)。也有可能Mike遇到了一個不太友好的警察,然後這個警察給Mike出具了一張罰單。(我們把這型別的警察稱之為“HardPolice”)。
Mike其實並不知道他會遇到什麼型別的警察,直到他因為超速而被警察要求停車下來,實際上這就是一種程式當中“執行時”的概念,只有在執行的時候,才知道,到底會遇到什麼型別的警察,實際上這就是“策略模式”。
public interface Strategy { public void processSpeeding(int speed); }
再來定義兩種不同型別的Strategy:
public class NicePolice implements Strategy { @Override public void processSpeeding(int speed) { System.out .println("This is your first time, be sure don't do it again!"); } }
public class HardPolice implements Strategy { @Override public void processSpeeding(int speed) { System.out.println("Your speed is " + speed + ", and should get a ticket!"); } }
定義一個需要依賴警察來處理超速問題的場景:
public class Situation { private Strategy strategy; public Situation(Strategy strategy){ this.strategy = strategy; } public void handleByPolice(int speed){ this.strategy.processSpeeding(speed); } }
最後,進行測試:
public class Main { public static void main(String[] args) { HardPolice hp = new HardPolice(); NicePolice ep = new NicePolice(); // In situation 1, a hard officer is met // In situation 2, a nice officer is met Situation s1 = new Situation(hp); Situation s2 = new Situation(ep); // the result based on the kind of police officer. s1.handleByPolice(10); s2.handleByPolice(10); } }
策略模式,實際上就是定義了一些演算法,並把他們都封裝起來,使得他們之間可以互相替代。實際上對應上面程式,就是定義了兩種演算法(NicePolice以及HardPolice),由於他們都實現了Strategy這個介面,那麼對於依賴於這個介面的例項物件來說,可以動態的對這個依賴進行注入,從而達到執行時確定具體使用哪一種演算法的目的。