zoukankan      html  css  js  c++  java
  • 策略(strategy)模式

    目的:

    把算法封装起来,并且使他们可以相互替换,使得算法可以独立于使用它的客户而变化。

    适用情景:

    1、  许多的类仅仅是行为有异(数据一致),”策略”提供了一种用多个行为中的一个行为来配置一个类的方法。

    2、  需要使用不同的算法,如可以根据不同参数选取不同的效率算法。

    3、  算法使用客户不应该知道的数据。

    4、  替换多个if/else或switch语句

    UML描述:


    协作:

             Strategy和Context相互作用以实现选定的算法。当算法被调用时,Context可以将该算法所需的数据传递给该Strategy。或者Context将自身作为一个参数传递给Strategy。

             Context将它的客户的请求转发给它的Strategy。客户通常创建并传递一个ConcreteStrategy对象给Context;这样,客户可以选取不同的ConcreteStrategy与Context交互。客户选取Strategy时需要了解这些Strategy到底有何不同,此时可能不得不向客户暴露具体的实现问题。

    数据接口的实现问题:

    1)      定义Strategy和Context接口

    一种办法是将Context将参数逐个传给Strategy的操作方法;另一种是让Context将自身作为一个参数传给Strategy的操作方法(可能有的数据是不必要的,但是接口简洁)

    2)      将Strategy作为模版参数

             使用这种方法不需要给Strategy定义接口的抽象类,把Strategy作为一个模版参数也使得可以将一个Strategy和它的Context静态绑定在一起,从而提高效率。

    适用条件:1) 可以在编译时选择strategy   2)strategy不需要在运行时改变

    3)      使Strategy对象成为可选的

             这种情形通过定义Strategy对象的缺省行为来实现,当Context访问Strategy时需先判断Strategy是否存在,如果客户使用缺省的行为就不需要处理Strategy对象。

    扩展:

    Strategy也可以被封装成单例形式,在Context中通过指针方式与Strategy交换(c语言的话也可以用函数指针实现)

  • 相关阅读:
    cmcc_simplerop
    WeiFenLuo.winFormsUI.Docking.dll的使用
    MySQL转换Oracle的七大注意事项
    icsharpcode
    详细介绍IIS7基于WAS 部署WCF服务《收藏》
    Win2008 IIS7日期格式更改方法 《转》
    SVCUtil使用说明(生成代理类)《收藏》
    Oracle中的高效语句
    WCF配置文件全攻略《收藏》
    设计高效合理的MySQL查询语句
  • 原文地址:https://www.cnblogs.com/OpenLinux/p/5020688.html
Copyright © 2011-2022 走看看