策略模式(Strategy Pattern)也稱作政策模式(Policy Pattern)。
定義:Define a family of algorithms ,encapsulat each one ,and make them interchangeable.(定義一組算法,將每個算法封裝起來,并且使他們之間可以互換。)
通用類圖:

策略模式的三個角色:
Context封裝角色: 起承上啟下的封裝作用,屏蔽高層模塊對策略、算法的直接訪問,封裝可能存在的變化。
Strategy抽象策略角色:定義每個策略或算法必須具有的方法和屬性
ConcreteStrategy具體策略角色:實現抽象策略中的操作,該類含有具體的算法。
優點:
1、算法可以自由切換;
2、避免了使用多重條件判斷;
3、擴展性好;
缺點:
1 、客戶端必須知道所有的策略類,并自行決定使用哪一個策略類。這就意味著客戶端必須理解這些算法的區別,以便適時選擇恰當的算法類。換言之,策略模式只適用于客戶端知道所有的算法或行為的情況。 2、 策略模式造成很多的策略類,每個具體策略類都會產生一個新類。有時候可以通過把依賴于環境的狀態保存到客戶端里面,而將策略類設計成可共享的,這樣策略類實例可以被不同客戶端使用。換言之,可以使用享元模式來減少對象的數量。實現:
/// <summary> /// 抽象的策略角色 /// </summary> public interface Strategy { //策略模式的運算法則 public void doSomething(); } /// <summary> /// 具體的策略角色1 /// </summary> public class ConcreteStrategy1 : Strategy { public void doSomething() { } } /// <summary> /// 具體的策略角色2 /// </summary> public class ConcreteStrategy2 : Strategy { public void doSomething() { } } public class Context { PRivate Strategy strategy = null; public Context(Strategy _strategy) { strategy = _strategy; } /// <summary> /// 封裝后的策略方法 /// </summary> public void doAnything() { strategy.doSomething(); } } public class Client { public static void main(String[] args) { //聲明一個具體的策略 Strategy strategy = new ConcreteStrategy1(); //聲明上下文對象 Context context = new Context(strategy); //執行封裝后的方法 context.doAnything(); } } 好了,這一章就寫到這,歡迎大家加入QQ群:280993838 。或者關注我的公眾號:
新聞熱點
疑難解答