本文共 2262 字,大约阅读时间需要 7 分钟。
策略模式别名Policy。
策略模式的意图是针对一组算法,将每个算法封装到具有共同接口的独立的类中,从而使得他们可以相互替换。
策略模式使得算法可以在不影响客户端的情况下发生变化。
使用策略模式可以把行为和环境分割开来。环境类负责维持和查询行为类,各种算法则在具体策略类中提供。由于算法和环境独立开来,算法的增减、修改都不会影响环境和客户端。当出现新的变化时,只需要实现新的策略类,并在客户端登记即可。
Note:策略模式并不决定何时使用何种算法(策略)
策略模式 V.S. 桥接模式:
Context(上下文,环境): 用一个ConcreteStrategy对象来配置;维护一个对Strategy对象的引用;可定义一个接口让Strategy访问它的数据;
抽象策略(Strategy): 定义一个接口或抽象类实现;定义所有支持的算法的公共接口;Context使用这个接口来调用某ConcreteStrategy定义的算法;
具体策略(ConcreteStretegy): 以Strategy接口实现某具体算法;
// Strategy pattern -- Structural example using System;// "Strategy"abstract class Strategy{ // Methods abstract public void AlgorithmInterface();}// "ConcreteStrategyA"class ConcreteStrategyA : Strategy{ // Methods override public void AlgorithmInterface() { Console.WriteLine("Called ConcreteStrategyA.AlgorithmInterface()"); }}// "ConcreteStrategyB"class ConcreteStrategyB : Strategy{ // Methods override public void AlgorithmInterface() { Console.WriteLine("Called ConcreteStrategyB.AlgorithmInterface()"); }}// "ConcreteStrategyC"class ConcreteStrategyC : Strategy{ // Methods override public void AlgorithmInterface() { Console.WriteLine("Called ConcreteStrategyC.AlgorithmInterface()"); }}// "Context"class Context{ // Fields Strategy strategy; // Constructors public Context( Strategy strategy ) { this.strategy = strategy; } // Methods public void ContextInterface() { strategy.AlgorithmInterface(); }}////// Client test/// public class Client{ public static void Main( string[] args ) { // Three contexts following different strategies Context c = new Context( new ConcreteStrategyA() ); c.ContextInterface(); Context d = new Context( new ConcreteStrategyB() ); d.ContextInterface(); Context e = new Context( new ConcreteStrategyC() ); e.ContextInterface(); }}