资料来源:吕震宇老师的博客
策略模式(课堂回忆):其实就是把环境和行为分开来,环境就只是提供客户端查找到相应的产品以及创建产品的环境。好比如在商城买东西,常见的打折,卖多少返还多少,等等之类的一些算法。“环境”只是提供一个查看商品的环境和下定的对象的环境,但是至于在计算商品价格的时候,因价格战要很灵巧的进行。所以可以把计算价格的算法分离开来,作为策略。
图例:
示例代码:
// 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();
}
}
/// <summary>
/// Client test
/// </summary>
public class Client
{
public static void Main( string[] args )
{
// Three contexts following different strategies
Context c = new Context( new ConcreteStrategyA() );
//先创建一个策略对象,通过把策略模式传到策略接口.
//让策略接口拷贝后成为特殊的策略模式,(在构造函数中)肯定要形成一个作为环境的当前策略,
//就可以实现替代丑陋的switch结构了
c.ContextInterface();
Context d = new Context( new ConcreteStrategyB() );
d.ContextInterface();
Context e = new Context( new ConcreteStrategyC() );
e.ContextInterface();
}
}