zoukankan      html  css  js  c++  java
  • 设计模式之策略模式(Strategy Pattern)

      模板方法是通过继承实现的,在父类中定义出算法的骨架,将不同点在子类中实现。而策略模式是通过接口实现的,策略中定义了完整的算法。它们有点像啊……

    策略模式的定义

      策略模式(Strategy Pattern),定义了一系列的算法,将每一种算法封装起来并可以互相替换使用,策略模式让算法独立于使用它的客户应用而独立变化。

      我的理解是,策略模式是透明的,对于策略的实现有时是不用关心的,我只要达到我的目的就可以了,而具体的实现可能有多种手段,而根据不同的选择可以有不同的手段。而对于模板方法来说,它的流程是基本固定的,而某个环境中的实现方式是可变的,但是整体是不变的。这是我理解的它们之间的不同,至于编码的话,模板方法使用的是继承的方式,而策略模式使用的是接口。

    代码示例

      仍然以吃面为主,比如程序员要吃面,程序员中午可能去便利店让店员泡面来吃,而程序员黑夜回家可能让老妈给煮面来吃。对于我们来说,我们是要吃面的,至于吃什么面,自己说一下就可以了,至于吃的这个面是怎么做的,就不关心了,做面的策略也根据不同的面有所不同。

     1 class StrategyPattern {
     2     public static void main(String[] args) {
     3         Ren cxy = new ChengXuYuan();
     4         
     5         System.out.println("程序员中午吃饭");
     6         
     7         cxy.setIZm(new PaoMian());
     8         cxy.eat();
     9         
    10         System.out.println("程序员晚上吃饭");
    11         
    12         cxy.setIZm(new ZhuMian());
    13         cxy.eat();
    14     }
    15 }
    16 
    17 interface IZuoMian {
    18     public void zuoMian();
    19 }
    20 
    21 class PaoMian implements IZuoMian {
    22     public void zuoMian() {
    23         System.out.println("揭开碗面的包装纸");
    24         System.out.println("冲开水");
    25         System.out.println("泡面中...");
    26         System.out.println("泡好了");
    27     }
    28 }
    29 
    30 class ZhuMian implements IZuoMian {
    31     public void zuoMian() {
    32         System.out.println("烧开水...");
    33         System.out.println("下面...");
    34         System.out.println("捞面...");
    35     }
    36 }
    37 
    38 abstract class Ren {
    39     public IZuoMian zm;
    40     
    41     public void setIZm(IZuoMian zm) {
    42         this.zm = zm;
    43     }
    44     
    45     public void eat() {
    46         zm.zuoMian();
    47         System.out.println("吃面");
    48     }
    49 }
    50 
    51 class ChengXuYuan extends Ren {
    52     
    53 }

      在Ren类中,都是要有eat()方法的,是人就要吃!但是吃什么要自己说。根据自己要吃的不同,具体做的也就不同了,这里是做面吃,当然这个做面也可以是做饭。

      在代码中实现了泡面和煮面两种方式,做面是一个接口即IZuoMian(),通过把做面的具体实现的类传递给Ren类中的接口属性,就可以通过该属性来完成具体的做面过程。

      执行输出如下:

    总结:

      总结来自于《大话设计模式》一书中第二章“商场促销——策略模式”。

    1、面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类。(这里是我的理解:也就是说策略只是一个算法,可以说是有相应的功能,而没有相应的属性,因此封装为一个接口更为合适)

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

    3、策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合;

    4、策略模式的Strategy类层次为Context定义了一系列的可供重用的算法或行为。继承有助于析取出这些算法中的公共功能;

    5、策略模式的优点是简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试;

    6、当不同的行为堆切在一个类中时,就很难避免使用条件语句来选择合适的行为。将这些行为封装在一个个独立的Strategy类中,可以在使用这些行为的类中消除条件语句;

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

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


    我的微信公众号:“码农UP2U”

  • 相关阅读:
    截取字符串为20个字
    GitFlow
    CSS3盒模型display:box;box-flex:3;
    CSS移动端多行显示多余省略号
    2017年6大热门开源项目
    七周七学习成为数据分析师
    2017-写给5年后的自己
    XGeocoding使用手册
    读书的5个秘诀
    如何快速成为数据分析师?(知乎)
  • 原文地址:https://www.cnblogs.com/tosser/p/9043673.html
Copyright © 2011-2022 走看看