博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
策略模式
阅读量:5742 次
发布时间:2019-06-18

本文共 2858 字,大约阅读时间需要 9 分钟。

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

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

  策略模式的优点:

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

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

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

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

  策略模式的结构图:

      

  策略模式的具体实现代码示例:

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来调用这些算法。

转载地址:http://jzizx.baihongyu.com/

你可能感兴趣的文章
HDU:七夕节
查看>>
简单的 Jquery 下拉菜单Demo
查看>>
ubuntu下源码包方式安装apache+mysql+php
查看>>
CSS英文单词强制换行
查看>>
tidb在DDL语句方面的测试
查看>>
linux中网络部分的总结
查看>>
zabbix日常监控项java(四又分之一,通用性强)
查看>>
php $_SESSION['HTTP_REFERER']返回上一页面
查看>>
10.25新随笔JavaScript01
查看>>
Android Studio 安装并使用genymotion
查看>>
多表联合查询
查看>>
JS-运算符
查看>>
transform:rotate()将元素进行不同角度的旋转
查看>>
数据备份和恢复
查看>>
requestAnimationFrame与setTimeout的定时器
查看>>
时频方向上重排
查看>>
决策树python实现小样例
查看>>
adaboost python实现小样例
查看>>
[09]表单元素(上)
查看>>
[CC-SEAPERM2]Sereja and Permutations
查看>>