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毫秒