技术开发 频道

策略(Strategy)模式简介



    【IT168 专稿】Strategy策略模式又名政策(Policy)模式,是属于设计模式中对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类,并且这些类(算法)可以相互替换。Strategy应用比较广泛,比如, 公司经营业务变化图, 可能有两种实现方式,一个是线条曲线,一个是框图(bar),这是两种算法,可以使用Strategy实现。图象压缩系列算法实现(不同的算法分别对应一个类)也可以采用Strategy模式实现。

    下面我将从五个方面详细介绍该模式。
    1. 意图与动机 
    当有一系统算法时,在算法的选择上,如果用if…else…则是非常不明智的,把这些算法抽象出来,然后根据程序的需要,动态地加载,这便是策略模式。定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。

    2. 结构
    Strategy的结构如下图所示:


下面简要介绍一下以上类图中各个类的作用:

    1) Context类为上下文类,负责维护和更新算法所要处理的环境和数据。譬如对于图象压缩来说,Context负责数据的提取、压缩参数的获得以及压缩以后善后工作等等;
    2) Strategy代表抽象的算法,譬如对于图象压缩来说,它代表的就是图象压缩算法,至于具体那种压缩?JEPG压缩还是GIF压缩,Strategy类不关心,它只为具体的图象压缩算法提供统一的接口;
    3) ConcreteStrategyA、ConcreteStrategyB、ConcreteStrategyC则代表特别具体的算法。
Context类维护Strategy的一个引用(或者指针)。一旦Context所维护的上下文有变化(譬如输入数据有变化),它就将这个职责转发给它的Strategy对象。Context的客户制定应该使用哪一种Strategy(算法)的方式是直接将它想要的具体的Strategy  (ConcreteStrategyA、ConcreteStrategyB、ConcreteStrategyC……)装入Composition中。
    3. 实用性
    当存在一下情况时,适合使用Strategy模式
    1) 许多相关的类仅仅是行为上的差异。“策略”提供了一种用多个行为中的一个行为类配置一个类的方法;
    2) 需要使用一个算法的不同的变体。例如,您可能会定义一些反映不同空间/时间权衡的算法。当这些变体实现为一个算法的类层次时,可以使用策略模式;
    3) 算法使用客户不应该知道的具体的实现步骤,可以使用策略模式以免暴露复杂的、与算法相关的数据结构;
    4) 一个类定义了多种行为,并且为这些行为在这个类的操作中以多个条件语句的形式出现相关的条件分支移入它们各自的Strategy类中,以代替这些语句。

0
相关文章