首页 > 代码库 > 设计模式第二站--策略模式

设计模式第二站--策略模式

             从简单工厂模式出发,现在到达第二站:策略模式。那么什么是策略模式,它作为设计模式的第二站和第一站又有怎样的联系或者区别,它的理解和学习能否让我们用到和联系到第一站?怎么个关联法?

          别急!下面我们就一起探究,康忙,北鼻!

一、什么是策略模式(Stragety)?

         按照书本上的定义来说,策略模式定义了算法家族,分别封装起来,让它们之间可以互相替换;此模式让算法的变化,不会影响到使用算法的用户。

         既然是定义都比较抽象,那么就先通过它的结构图来认识一下这个神秘的事物。

   

    也许还是有些抽象,那么我们将它具体化,看下面的这样一个图(通过商场搞活动这个例子来说明):

    

二、和简单工厂模式的联系和区别

             工厂模式是创建型模式 ,关注对象的创建;策略模式是行为性模式 ,关注行为的封装;
          简单点说就是,工厂类的使用者需要不是自己创建的对象,策略模式中Context类的使用者需要的是自己创建的对象。更简单的说法就是:简单工厂模式:我没有,我需要你的。策略模式:我自己有,我用我自己的

          使用一个网上的例子:

           工厂模式:有一天你决定去吃披萨,一看菜单,哦,种类很多呀,你就点了个培根披萨,过了二十分钟,你的披萨就来了就可以吃到了。但这个披萨是怎么做的,到底面粉放了多少,培根放了多少,佐料放了多少,有多少到工序,你是不需要管的,你需要的是一个美味培根披萨。
           策略模式:同样还是在披萨店,你要一个培根披萨,老板说想吃自己去做吧。原料有培根、面粉、佐料。工序有1、2、3工序,你自己去做吧。然后你就需要自己去做,到底放多少培根,放多少面粉,放多少佐料,这都你自己来决定,工序1、2、3,你是怎么实现的,都你自己决定。最后你得到了披萨。

            一般情况下,策略模式是为了解决策略的切换与扩展,更简洁的说是定义策略族,分别封装起来,让他们之间可以相互替换,策略模式让策略的变化独立于使用策略的客户。可以应用的场景有优惠系统、工资计算系统等。上例中,你可以自己做多种口味的披萨的,青菜的,牛肉的,海鲜的你都可以一次都做。

            而简单工厂模式主要解决的是资源的统一分发,将对象的创建完全独立出来,让对象的创建和具体的使用客户无关。主要应用在多数据库选择,类库文件加载等。上例中你可以点很多披萨,只要披萨店给提供的,你都可以点。很明显的是策略模式是开放的,作为一个主体你的活动范围是全程的,大多数事情要你自己亲力亲为。而工厂模式作是封闭的,作为主体的你的活动范围是有限的,很多事情都帮组你做好了,你直接“点”就可以了。

三、我的看法

             其实这个策略模式和简单工厂模式一样,仅仅是对面向对象继承中常用的Override技术的一种应用。

             简单工厂模式中有一个工厂类,负责根据输入参数的不同来生成不同的子类,并将生成的子类作为基类返回(这样可以让客户端在使用的时候很方便)。客户端只需要调用工厂类创建一个基类的实例,然后调用这个实例的函数来实现自己的功能。而策略模式中的Context类的功能基本上就是对工厂类的强化版本,它也负责根据输入参数来生成不同的类,只是它并不返回生成类,而是将生成类所实现的功能接口包装一次,提供给客户。这样对客户来说,他们只需要知道这一个Context类就可以完成他们想要的功能,而不必再知道其他的信息。

    


           写到这里,不知道我有没有把策略模式说清楚,学完所有的模式整体对比应该会更清楚一点。
            

 

设计模式第二站--策略模式