策略模式 - OK

  策略模式(Strategy):它定义了算法家族,分别封装起来,让他们之间能够互相替换,此模式让算法的变化不会影响到使用算法的客户。javascript

  策略模式是一种定义一系列算法的方法,从概念上来看,全部这些算法完成的都是相同的工做,只是实现不一样,它能够以相同的方式调用全部的算法,减小了各类算法类与使用算法类之间的耦合。事实上你能够将一个继承自抽象策略类的称为具体策略,就是策略模式中的策略1,策略2......html

  策略模式的优势:java

  策略模式的Strategy类层次为Context定义了一系列的可供重用的算法或行为。继承有助于析取出这些算法的公共功能。策略模式的另外一个优势是简化了单元测试,由于每一个算法都有本身的类,能够经过本身的接口单独测试。git

  说了这么多,策略模式究竟解决的是什么问题呢?算法

  策略模式就是用来封装算法的,但在实践中,咱们发现能够用它来封装几乎任何类型的规则,只要在分析过程当中听到须要在不一样时间应用不一样的业务规则,就能够考虑使用策略模式处理这种变化的可能性。设计模式

  在基本策略模式中,选择所用具体实现的职责由客户端对象承担,并转给策略模式的Context对象。ide

  策略模式的结构图:post

      

  策略模式的具体实现代码示例:单元测试

复制代码
namespace 策略模式
{
    public class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("我钓了一条鱼,应该怎么煮呢?");

            Context context;
            context = new Context(new ConcreteStrategyA());  //客户端依赖具体实现类了
            context.RunMethod();

            context = new Context(new ConcreteStrategyB());
            context.RunMethod();

            Console.ReadKey();
        }
    }

    //抽象算法类
    public abstract class Strategy
    {
        //算法方法
        public abstract void AlgorithmInterface();
    }

    //具体策略1
    public class ConcreteStrategyA : Strategy
    {
        public override void AlgorithmInterface()
        {
            Console.WriteLine("加水、上蒸笼、开火、清蒸!");
        }
    }

    //具体策略2
    public class ConcreteStrategyB : Strategy
    {
        public override void AlgorithmInterface()
        {
            Console.WriteLine("热锅、放油、红烧!");
        }
    }

    //上下文
    public class Context
    {
        Strategy strategy;

        //构造方法接收具体对象
        public Context(Strategy strategy)
        {
            this.strategy = strategy;
        }

        //调用方法
        public void RunMethod()
        {
            strategy.AlgorithmInterface();
        }
    }
}
复制代码

 

  以上代码感受到了什么?策略模式无论建立,它作的事很是少,少到什么程度?测试

  你传个对象给我,我帮你调用这个对象的方法(这个工做主要经过Context来维护),我无论你这对象怎么建立,但你得给我个对象。策略模式无论对象的建立,那么它实质上是什么。用类图说明。

  

  从上面的类图看到一个问题。由于,我调用你时,我要给你传个对象,上面的例子直接new()。所以,客户端依赖于具体实现类了。

  因此,策略模式一般与一些建立对象的模式混合使用,好比负责维护调用具体策略的Context类搭配个简单工厂:

复制代码
    public class Context
    {
        Strategy strategy = null;
        //调用方法
        public void RunMethod(string type)
        {
            
            switch (type)
            {
                default:
                case "清蒸":
                    strategy = new ConcreteStrategyA();
                    break;
                case "红烧":
                    strategy = new ConcreteStrategyB();
                    break;
            }
            strategy.AlgorithmInterface();
        }
    }
复制代码

  这样外部就依赖Context类了:

复制代码
        static void Main(string[] args)
        {
            Console.WriteLine("我钓了一条鱼,应该怎么煮呢?");

            Context context = new Context();
            context.RunMethod("清蒸");
            context.RunMethod("红烧");

            Console.ReadKey();
        }
复制代码

  最后回顾一下:

  策略模式无论对象建立,它的目的在于封装不一样的算法,根据传入的对象,调用具体的策略方法,在上面的示例程序加入简单工厂模式的缘由,是由于要建立对应的具体类,要分清哪些代码属于哪一个模式的范畴。

  搞了半天,策略模式就是一个类封装一个算法,实现一个算法接口,而后搞个Context来调用这些算法。

 
 
分类: 设计模式
 
0
0
 
(请您对文章作出评价)
 
« 上一篇: 简单工厂模式 - OK
» 下一篇: 装饰者模式 - OK
相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息