zoukankan      html  css  js  c++  java
  • 二十三、 Strategy 策略(行为型模式)

    1. 动机
    在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将这些算法都编码到对象中,将会使对象变得异常复杂;而且有时候支持不使用的算法也是一个性能负担。如何在运行时根据需要透明地更改对象的算法?将算法与对象本身解耦,从而避免上述问题? 

    2. 意图
    定义一系列算法,把它们一个个封装起来,并且使它们可互相替换。该模式使得算法可独立于使用它的客户而变化。

    3. 结构图
     

    4. 几个要点
    • Strategy及其子类为组件提供了一系列可重用的算法,从而可以使得类型在运行时方便地根据需要在各个算法之间进行切换。所谓封装算法,支持算法的变化。
    • Strategy模式提供了用条件判断语句以外的另一种选择,消除条件判断语句,就是在解耦合。含有许多条件判断语句的代码通常都需要Strategy模式。
    • 与State类似,如果Strategy对象没有实例变量,那么各个上下文可以共享同一个Strategy对象,从而节省对象开销。 

    5. .net平台的应用
        ArrayList类的Sort方法的实现方式就是一个典型的Strategy模式应用,将排序功能抽象为一个IComparable接口,作为参数传递给sort方法,从而隔离依赖。

    6. 个人体会
        面向对象设计模式的核心就是找出变化点,并对其进行抽象,然后让程序去依赖抽象,从而将变化隔离到主逻辑之外。
        比如ArrayList的Sort方法就是一个变化点,IComparable是抽象,排序算法内部逻辑的改变,不会影响到调用方的调用逻辑。

  • 相关阅读:
    百度之星资格赛1001——找规律——大搬家
    HDU1025——LIS——Constructing Roads In JGShining's Kingdom
    DP(递归打印路径) UVA 662 Fast Food
    递推DP UVA 607 Scheduling Lectures
    递推DP UVA 590 Always on the run
    递推DP UVA 473 Raucous Rockers
    博弈 HDOJ 4371 Alice and Bob
    DFS(深度) hihoCoder挑战赛14 B 赛车
    Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 2)
    DP(DAG) UVA 437 The Tower of Babylon
  • 原文地址:https://www.cnblogs.com/stone_lv/p/2058083.html
Copyright © 2011-2022 走看看