什麼是策略者模式? 策略模式是針對一組演算法,將每個演算法封裝到具有公共介面的獨立的類中,從而使它們可以相互替換。策略模式使得演算法可以在不影響到客戶端的情況下發生變化。對演算法的包裝,是把使用演算法的責任和演算法本身分割開,委派給不同的對象負責。策略模式通常把一系列的演算法包裝到一系列的策略類裡面。用一句話慨括 ...
什麼是策略者模式?
策略模式是針對一組演算法,將每個演算法封裝到具有公共介面的獨立的類中,從而使它們可以相互替換。策略模式使得演算法可以在不影響到客戶端的情況下發生變化。對演算法的包裝,是把使用演算法的責任和演算法本身分割開,委派給不同的對象負責。策略模式通常把一系列的演算法包裝到一系列的策略類裡面。用一句話慨括策略模式就是——“將每個演算法封裝到不同的策略類中,使得它們可以互換”。
該模式涉及到三個角色:
- 環境角色(Context):持有一個Strategy類的引用
- 抽象策略角色(Strategy):這是一個抽象角色,通常由一個介面或抽象類來實現。此角色給出所有具體策略類所需實現的介面。
- 具體策略角色(ConcreteStrategy):包裝了相關演算法或行為。
代碼實現
/// <summary> /// 抽象策略 /// </summary> public interface ICommunication { bool Send(object data); } /// <summary> /// 串口 /// </summary> public class Serial : ICommunication { public bool Send(object data) { Console.WriteLine("通過串口發送一個數據的演算法"); return true; } } /// <summary> /// 網口 /// </summary> public class Lan : ICommunication { public bool Send(object data) { Console.WriteLine("通過網口發送一個數據的演算法"); return true; } } /// <summary> /// 上下文環境 /// </summary> public class Context { private ICommunication _communication; public void SetStrategy(ICommunication communication)//傳遞具體的策略 { this._communication = communication; } public bool Send(object data) { return this._communication.Send(data); } } /// <summary> /// 調用 /// </summary> /// <param name="args"></param> static void Main(string[] args) { Console.WriteLine("請輸入通信類型:Lan、Serial"); string input = Console.ReadLine(); object data = new object(); Strategy.Context context = new Strategy.Context(); if (input.Equals("Lan")) { context.SetStrategy(new Strategy.Lan()); } else { context.SetStrategy(new Strategy.Serial()); } context.Send(data); Console.ReadLine(); }
策略者模式的優缺點
優點:
- 策略類之間可以自由切換。由於策略類都實現同一個介面,所以使它們之間可以自由切換。
- 易於擴展。增加一個新的策略只需要添加一個具體的策略類即可,基本不需要改變原有的代碼。
- 避免使用多重條件選擇語句,充分體現面向對象設計思想。
缺點:
- 客戶端必須知道所有的策略類,並自行決定使用哪一個策略類。這點可以考慮使用IOC容器和依賴註入的方式來解決
- 策略模式會造成很多的策略類
策略者模式的適用場景
在下麵的情況下可以考慮使用策略模式:
- 一個系統需要動態地在幾種演算法中選擇一種的情況下。那麼這些演算法可以包裝到一個個具體的演算法類裡面,併為這些具體的演算法類提供一個統一的介面。
- 如果一個對象有很多的行為,如果不使用合適的模式,這些行為就只好使用多重的if-else語句來實現,此時,可以使用策略模式,把這些行為轉移到相應的具體策略類裡面,就可以避免使用難以維護的多重條件選擇語句,並體現面向對象涉及的概念。