定义
定义一系列算法,将它们一个个封装起来,并且使它们可以互相替换,该模式使得算法可独立于使用它的客户而变化。 --《设计模式》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(); } } }
运行结果: