策略模式是對算法的包裝,把使用算法的責任和算法自己分隔開,委派給不一樣的對象管理。策略模式一般把一系列的算法包裝到一系列的策略類裏面,做爲一個抽象策略類的子類。算法
做用ide
將算法的責任和自己進行解耦,使得:spa
1.算法可獨立於使用外部而變化設計
2.客戶端方便根據外部條件選擇不一樣策略來解決不一樣問題orm
策略模式僅僅封裝算法(包括添加 & 刪除),但策略模式並不決定在什麼時候使用何種算法,算法的選擇由客戶端來決定。對象
實例繼承
背景:有一家百貨公司,最近在定年度的促銷活動接口
衝突:每一個節日用同一個促銷活動太枯燥,沒吸引力it
解決方案:針對不一樣節目使用不一樣促銷活動進行促銷class
步驟1:
定義抽象策略角色(Strategy):百貨公司全部促銷活動的共同接口
public abstract class Strategy { public abstract void showActivity(); }
步驟2:
定義具體策略角色(Concrete Strategy):
如下是每一個具體活動
//爲春節準備的促銷活動A class StrategyA extends Strategy{ @Override public void showActivity() { System.out.println("春節促銷活動A"); } } //爲中秋節準備的促銷活動B class StrategyB extends Strategy{ @Override public void showActivity() { System.out.println("中秋節促銷活動B"); } } //爲聖誕節準備的促銷活動C class StrategyC extends Strategy{ @Override public void showActivity { System.out.println("聖誕節促銷活動C"); } }
步驟3:
定義環境角色(Context):用於鏈接上下文,即把促銷活動推銷給客戶,這裏能夠理解爲銷售員
class Context_SalesMan{ private Strategy strategy;//持有抽象策略角色的引用 //生成銷售員實例時告訴銷售員什麼節日(構造方法) //使得讓銷售員根據傳入的參數(節日)選擇促銷活動(這裏使用一個簡單的工廠模式) public SalesMan(String festival) { switch ( festival) { case "A": //春節就使用春節促銷活動 strategy = new StrategyA(); break; case "B": //中秋節就使用中秋節促銷活動 strategy = new StrategyB(); break; case "C": //聖誕節就使用聖誕節促銷活動 strategy = new StrategyC(); break; } }
//向客戶展現促銷活動 public void SalesManShow(){ strategy.showActivity(); }
public class StrategyPattern { public static void main(String[] args){ Context_SalesMan mSalesMan ; //春節來了,使用春節促銷活動 System.out.println("對於春節:"); mSalesMan = new Context_SalesMan("A"); mSalesMan.SalesManShow(); //中秋節來了,使用中秋節促銷活動 System.out.println("對於中秋節:"); mSalesMan = new Context_SalesMan("B"); mSalesMan.SalesManShow(); //聖誕節來了,使用聖誕節促銷活動 System.out.println("對於聖誕節:"); mSalesMan = new Context_SalesMan("C"); mSalesMan.SalesManShow(); } }
運行結果:
總結
優勢
策略類之間能夠自由切換
因爲策略類都實現同一個接口,因此使它們之間能夠自由切換。
易於擴展
增長一個新的策略只須要添加一個具體的策略類便可,基本不須要改變原有的代碼,符合「開閉原則「
避免使用多重條件選擇語句(if else),充分體現面向對象設計思想。
缺點
客戶端必須知道全部的策略類,並自行決定使用哪個策略類。
策略模式將形成產生不少策略類,能夠經過使用享元模式在必定程度上減小對象的數量。
策略模式的本質:少用繼承,多用組合