定義定義一系列演算法,將它們一個個封裝起來,並且使它們可以互相替換,該模式使得演算法可獨立於使用它的客戶而變化。 --《設計模式》GoFUML類圖使用場景一個系統有許多類,而區分它們的只是他們直接的行為時。在有多種演算法相似的情況下,使用if…else…所帶來的複雜和難以維護。關鍵組成部分1,抽象策略角色... ...
定義
定義一系列演算法,將它們一個個封裝起來,並且使它們可以互相替換,該模式使得演算法可獨立於使用它的客戶而變化。 --《設計模式》GoF
UML類圖
使用場景
- 一個系統有許多類,而區分它們的只是他們直接的行為時。
- 在有多種演算法相似的情況下,使用if…else…所帶來的複雜和難以維護。
關鍵組成部分
1,抽象策略角色(Strategy):定義公共介面,Context上下文使用這個介面調用不同的演算法,一般使用介面實現(也可以使用抽象類)。
2,具體策略角色(ConcreteStrategy):介面的實現,實現具體的演算法。
3,上下文角色(Context):維護一個策略對象的引用,並用定義允許策略訪問其數據的介面。
C#代碼實現
using System; namespace DoFactory.GangOfFour.Strategy.Structural { /// <summary> /// MainApp startup class for Structural /// Strategy Design Pattern. /// </summary> class MainApp { /// <summary> /// Entry point into console application. /// </summary> static void Main() { Context context; // Three contexts following different strategies context = new Context(new ConcreteStrategyA()); context.ContextInterface(); context = new Context(new ConcreteStrategyB()); context.ContextInterface(); // Wait for user Console.ReadKey(); } } /// <summary> /// The 'Strategy' abstract class /// </summary> abstract class Strategy { public abstract void AlgorithmInterface(); } /// <summary> /// A 'ConcreteStrategy' class /// </summary> class ConcreteStrategyA : Strategy { public override void AlgorithmInterface() { Console.WriteLine( "Called ConcreteStrategyA.AlgorithmInterface()"); } } /// <summary> /// A 'ConcreteStrategy' class /// </summary> class ConcreteStrategyB : Strategy { public override void AlgorithmInterface() { Console.WriteLine( "Called ConcreteStrategyB.AlgorithmInterface()"); } } /// <summary> /// The 'Context' class /// </summary> class Context { private Strategy _strategy; // Constructor public Context(Strategy strategy) { this._strategy = strategy; } public void ContextInterface() { _strategy.AlgorithmInterface(); } } }
運行結果: