• 策略模式


    策略模式

    一 意图

    在平时的软件开中,我们对一个功能可能有多种不同的实现方式。程序需要在这些不同的实现方式之间进行切换。而实现方式的切换,程序中往往需要大量判断逻辑的代码。当每增加一种新的实现方式后,程序的复杂度也会随之增加。

    对于这种情况,策略模式就是一种好的解决方案。使用策略模式,可以把这些实现方式转移到相应的具体策略类里面,这样就可以消除程序大量的判断逻辑的代码,也可以很好的提高程序的扩展性。

        其实以上的每一种实现方式,对应了策略模式中的一种算法。它分开了算法的定义和使用。

    二 定义

        策略模式定义一系列算法类,将每一个算法封装起来,并让它们可以相互替换,策略模式让算法独立于使用它的客户而变化。策略模式是一种对象行为型模式。

    三 类图

     

    Strategy(抽象策略类):抽象策略类可以是接口,也可以是抽象类。它声明了某种算法,在具体策略类中会现实了抽象策略类声明的算法。

    ConcreteStrategy(具体策略类):具体策略类是抽象策略类的子类,它实现了抽象策略类声明的算法。

     Context(环境类)在环境类中,声明了一个抽象策略类,用于定义所采用的策略。在环境类中我们使用具体的策略类。

    四 代码示例

        以交通工具为例,假如我们要从A地去往B地。我们可以选择诸如“公共汽车”,“火车”,“飞机”等多种交通工具。

         这三种交通工具就相当于三个具体的策略类。他们都有交通的属性,可以把人和物品从一个地方转移到另一个地方,只是具体方式不同而已。不同的方式就相当于不同的算法。

     

    我们定义了一个交通工具的抽象的策略接口。申明了一个run方法。

     

        我们定义了三个具体的交通工具类(具体策略类),实现了抽象策略接口的run方法。三种交通工具提供了三种不同的run方法的实现,这三种不同的run方法的就是一系列算法。

     

        在环境类中,我们定义了抽象工具类的接口。通过属性设置,我们可以替换不同的交通工具。在环境类中run方法中,封装了设置交通工具的run方法。

     

    运行结果

     

    五 总结

        策略模式分离了算法的定义和使用。在服务端我们可以定义一系列的算法,这些算法有一个共同基类。客户端只需要知道使用哪一个算法。使用策略模式,我们可以很方便的切换算法和增加新的算法。

    优点:

    1. 策略模式可以在不修改代码的情况下,可以任意切换算法。增加新的算法也很方便。符合了“开闭原则”。
    2. 策略模式所有的算法都继承自一个基类,便于对具体算法进行统一管理。继承可以在基类中抽象出所有算法的公共方法。
    3. 客户端可以不需要知道算法的复杂度。只需要知道使用哪个算法。

    缺点:

    1. 策略模式中客户端需要知道所有的算法,才能知道具体使用哪一个算法。
    2. 策略模式可能会使系统中产生多个具体的算法类。

     

  • 相关阅读:
    VirtualBox中的网络连接方式详解
    DRUID连接池的实用 配置详解
    redis之如何配置jedisPool参数
    怎么把myeclipse项目导入IDEA中
    最新Hadoop大数据开发学习路线图
    编程能力七段论(下)
    编程能力七段论(上)
    移动无线测试技能树
    WebView加载网页不显示图片解决办法
    编程能力七段论
  • 原文地址:https://www.cnblogs.com/YaoxTao/p/16031491.html
Copyright © 2020-2023  润新知