策略模式屬於對象的行爲模式,其用意是針對一組算法,將每個算法封裝到具備共同接口的獨立的類中,從而使得它們能夠相互替換。策略模式使得算法能夠在不影響客戶端的狀況下變化。java
public class Context { //持有一個具體策略的對象 private Strategy strategy; /** * 構造函數,傳入一個具體策略對象 * @param strategy 具體策略對象 */ public Context(Strategy strategy){ this.strategy = strategy; } /** * 策略方法 */ public void contextInterface(){ strategy.strategyInterface(); } }
public interface Strategy { /** * 策略方法 */ public void strategyInterface(); }
public class ConcreteStrategyA implements Strategy { @Override public void strategyInterface() { //相關的業務 } } //後面兩個重複這個類
咱們以手抓餅訂單爲例,即有普通手抓餅,高級手抓餅,頂級手抓餅。算法
場景就是接單類,根據具體的算法來生產不一樣的手抓餅訂單。ide
public class ReceiveOrder { private ShouzhuabingOrder shouzhuabingOrder; public ReceiveOrder(ShouzhuabingOrder shouzhuabingOrder) { this.shouzhuabingOrder = shouzhuabingOrder; } //其實這咱們能夠對該函數進行一些功能強化,讓其在算法選擇的基礎上進行一些功能的擴展 //具體的能夠參考java中Collections類下面的sort方法。 //例如咱們能夠經過參數做爲輸入,至關於用戶除了作定製化的手抓餅外,還能夠再次基礎上進行個性化的定製。 public String makeOrder() { return shouzhuabingOrder.makeOrder(); } }
public interface ShouzhuabingOrder { public String makeOrder(); }
public class OriginOrder implements ShouzhuabingOrder { @Override public String makeOrder() { return "我是基礎的手抓餅,只有一張餅,一個蛋還有各類醬"; } }
public class MediumOrder implements ShouzhuabingOrder { @Override public String makeOrder() { return "我是一箇中級手抓餅,自帶一張餅,兩個蛋,還有自制醬料"; } }
public class HighOrder implements ShouzhuabingOrder { @Override public String makeOrder() { return "我是高級手抓餅,我有一張餅,兩個蛋,一個裏脊,一個薄脆還有自制醬料。"; } }
public class Test { public static void main(String[] args) { HighOrder highOrder = new HighOrder(); ReceiveOrder receiveOrder = new ReceiveOrder(highOrder); System.out.println(receiveOrder.makeOrder()); } }
無論算法的實現,而是對算法作一個選擇,組織,調用,從而使程序在結構上更加清晰,也更加方便維護和擴展。函數
算法的地位相同,能夠相互替換,相互無依賴,策略模式中的算法關係未:相同行爲的不一樣實現。this
運行時,每個時刻只能使用一個具體的策略實現對象,雖然能夠動態切換,可是在同一時刻,只能是一個。spa
若全部算法均有具體的行爲,能夠將算法接口改爲抽象類,同時共有的行爲進行定義。3d
1.策略模式提供了管理相關算法的算法族的方法,能夠將部分共有代碼移到父類,從而避免重複。code
2.使用策略模式,能夠避免重複條件的斷定(if-else)。對象
1.客戶端必須知道全部的策略,並自行決定使用哪一種策略,以便選用合適的算法。(我尚未想明白這點,這自行判斷還不是要依賴if else)blog
2.備選的策略多的話,類的數量會不少,不方便管理。