Programming 版 (精华区)

发信人: Sun (大灯泡), 信区: SoftEng
标  题: [Design Pattern] Strategy
发信站: 哈工大紫丁香 (2001年03月23日07:59:14 星期五), 站内信件

发信人:Crystal_Y (小衲)  版面名称:SoftEng(947)
标 题:[Design Pattern] Strategy
发信站:中国科大BBS站 (Thu, 22 Mar 2001 13:55:39 )
标 记:精华


   Strategy再次从一个类中抽出部分数据和操作,既达到了隐藏,又作到
了灵活。

  Strategy能不能看作只有Implementor端变化的Bridge模式呢?我又开
始糊涂了。

  如果一个类的某个行为有各种实现的方式,我们可以把实现该行为所要
作的操作和数据抽取出来一个接口作为基类Strategy,让各个
ConcreteStrategy来实现这个行为。

  如果你发现,你有很多个类,从同一基类而来,对外的数据操作都一
样,只是某些行为方式不同,那么,你可以修改修改,试一试Strategy把这
些类合并。
  再一次的,Stragety消除了switch-case,呵呵

  GoF中把使用ConcreteStrategy的类称作Context,是很有道理的,因为
Strategy实现的是算法,而算法的运行需要一个参数环境。
  至于client,只和Context打交道,但是client需要知道各个
ConcreteStrategy的信息和特征,因为具体选择哪个算法,还是由client来
确定的(这和用不用Strategy没关系,在使用switch-case型代码的时候,
client也是要传递它需要的StrategyType进来)。

  然而,由于负责向Strategy传递参数,而Strategy必须考虑到所有
ConcreteStrategy的需要,Context往往要传递不少内容,即使某些内容对
某个ConcreteStrategy一点用也没有(好在具体到某一类算法,需要传递
的参数都还是差不多的)。
  整个的把Context传递进去,是很不好的作法,这样会严重妨碍Strategy
的可重用性,因为Strategy必须知道Context的存取数据接口,除非把
Context和Strategy一起提供,否则单独的Strategy是没法重用的,而
Context提供出来又有何意义?

  共享的一大特点就是stateless,这和connectionless有点像,建立了
state或connection,就是专用的,非共享的。所以要想把Strategy做成可
共享的Flyweight,必须保证Strategy本身是stateless的,即任何一次调用
都是可以单独进行(举例说FindFirst,FindNext这一系列就不是stateless的)。

  URL http://202.38.79.111/GoF/pat5ifs.htm

--
※ 来源: 中国科大BBS站 [bbs.ustc.edu.cn]



--
    我很差劲!
    我是一个不务正业的人!
    因为,在我这个年纪,
    正业是找女朋友。

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: sunner.hit.edu.cn]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:6.244毫秒