设计模式之行为型模式---策略模式

来源:互联网 发布:mac版枪火兄弟连2 编辑:程序博客网 时间:2024/06/08 06:07

一、策略模式的特点

在策略模式中我们定义一个基类Strategy作为公共的接口类,然后在下方不同的类通过继承实现同一个接口,实现不同的功能,这样做到在客户端可以调用统一个接口,根据不同的需求实现不同的功能。而Contex作为一个调配类根据客户指定的功能,调用实现这个功能的接口。

策略模式作用就是将实现功能的算法进行单独的封装,使用时可以相互替代其他的算法。

策略模式的优点:

1、可以在自己定义的算法之间自由的切换出来问题

2、易于扩展出来其他问题的算法

3、容易对每个算法进行修改由不会影响其他的算法对象。

二、策略模式的实现

1、策略模式的实现模型

2、策略模式的代码实现

 abstract class Strategy{ public abstract void AlgorithmInterface();}class ConcretesStrategyA : Strategy{    public override void AlgorithmInterface()    {        Console.WriteLine("实现了算法A");    }}class ConcretesStrategyB : Strategy{    public override void AlgorithmInterface()    {        Console.WriteLine("实现了算法B");    }}class ConcretesStrategyC : Strategy{    public override void AlgorithmInterface()    {        Console.WriteLine("实现了算法C");    }}class Context{    Strategy strategy;    public Context(Strategy strategy)    {        this.strategy = strategy;    }    public void ContextInterface()    {        strategy.AlgorithmInterface();    }}class wMain{    static void Main()    {        Context context;        context = new Context(new ConcretesStrategyA());        context.ContextInterface();        context = new Context(new ConcretesStrategyB());        context.ContextInterface();        context = new Context(new ConcretesStrategyC());        context.ContextInterface();        Console.Read();    }}

运行结果:

三、策略模式与工厂模式的结合

使用策略模式的时候还是需要由客户端指定创建那个对象,然后传递给策略模式,这样本身没有解决客户的判断压力,我们可以通过与工厂模式的结合来减轻客户的判断压力。客户端只需要知道需要实现那种功能,只需要将这种功能通知给策略适配器,而不必判断使用那个对象。

代码实现

using System; abstract class Strategy{ public abstract void AlgorithmInterface();}class ConcretesStrategyA : Strategy{    public override void AlgorithmInterface()    {        Console.WriteLine("实现了算法A");    }}class ConcretesStrategyB : Strategy{    public override void AlgorithmInterface()    {        Console.WriteLine("实现了算法B");    }}class ConcretesStrategyC : Strategy{    public override void AlgorithmInterface()    {        Console.WriteLine("实现了算法C");    }}//改良的Contexclass ContextTool{    public Strategy strategy = null;    public ContextTool(string type)        {        switch (type)        {            case "A":                strategy = new ConcretesStrategyA();                break;            case "B":                strategy = new ConcretesStrategyB();                break;            case "C":                strategy = new ConcretesStrategyC();                break;            default:break;        }            }    public void ContextInterface()    {        strategy.AlgorithmInterface();    }}class wMain{    static void Main()    {        ContextTool tools;        tools = new ContextTool("A");        tools.ContextInterface();        tools = new ContextTool("B");        tools.ContextInterface();        tools = new ContextTool("C");        tools.ContextInterface();        Console.Read();    }}

运行结果 :

0 0