策略模式随笔
http://www.cnblogs.com/zhanghaipeng-Unity3D/p/4752734.html
策略模式是通过将一系列算法分别封装起来,让它们之间可以相互替换,此模式让算法的变化,不会影响到使用算法的用户。所有的算法都完成的是相同的工作,只是不同算法的实现方式不同,此模式可以让算法实用类以相同的方式调用不同的算法,降低了算法和算法实用类之间的耦合。
假如一个人(客户端,算法使用类),现在比较饿(需要解决的问题),所以要吃东西(算法基类)来消除饿的感觉,同样是吃东西,我们可以吃米饭(算法类1),吃馒头(算法类2),吃肉(算法类3)等等,来达到让我们不饿的目的,UML图如下:
代码实现如下:
//如何解决饿
public class Context
{
Strategy strategy;
public Context(Strategy strategy) //初始化时传入策略
{
this.strategy = strategy;
}
public void ContextInterface() //策略使用接口
{
strategy.AlgorithmInterface();
}
}
//算法基类
public abstract class Strategy
{
public abstract void AlgorithmInterface();
}
//吃肉算法
public class ConcreteStrategyC : Strategy
{
public override void AlgorithmInterface()
{
Console.WriteLine("吃肉");
}
}
//吃馒头算法
public class ConcreteStrategyB : Strategy
{
public override void AlgorithmInterface()
{
Console.WriteLine("吃馒头");
}
}
//吃米饭算法
public class ConcreteStrategyA : Strategy
{
public override void AlgorithmInterface()
{
Console.WriteLine("吃米饭");
}
}
//客户端
class Program
{
static void Main(string[] args)
{
Console.WriteLine("饿了...");
Console.WriteLine("喜欢吃什么?");
string likeFood = Console.ReadLine().Trim();
Context context = null;
switch(likeFood)
{
case "rice":
context = new Context(new ConcreteStrategyA());
break;
case "bun":
context = new Context(new ConcreteStrategyB());
break;
case "meat":
context = new Context(new ConcreteStrategyC());
break;
}
if (null != context)
context.ContextInterface();
}
}
正如我们所看到的,当需要增加新的算法时,仍然需要修改原有代码。