继续我们的学习, 9章。Strategy模式
回顾我们的目标:
·    按接口编程
·    尽量用聚合代替继承
·    找出变化并封装之
Strategy模式
例:比如需要显示点,线,正方形,圆。
 
如果还需要一种带有特殊边线的正方形,我们从正方形继承,重用Square中的代码,只是覆盖DrawBorder方法。
导致的问题:
弱内聚:                    如果有许多边线类型,Square还要关心所有的边线绘制。
减少复用可能性                    当我们为不同边线编写了代码,并加入Square及其派生类,怎样才能将这些代码复用于其它形状呢?
无法根据变化很好的伸缩            如果需求变更,要求两种不同的底纹怎么办?为了应对所有选择,要不断特化Square

优秀的解决方法:
标准图:
 
意图                    可以根据上下文,使用不同的业务规则和算法
问题                    对所需算法的选择取决于发出请求的客户或要处理的数据,算法预料会发生变化。
解决方案                将算法封装到一个单独的类中
                    将这个算法类包含在客户对象中

参与者和协作者                Strategy指定了如何使用不同的算法
                    各Concrete Strategy 实现了这些不同的算法
                    Context通过类型为Strategy的引用使用具体的Concrete Strategy对象。
                    Context将来自客户的请求发个Strategy

效果                    必须以相同的接口调用所有算法
分离了业务规则和客户对象
                    定义了一系列算法
                    避免使用Switch语句

实现                    让使用算法的类(Context)包含一个抽象策略类(Strategy)
该抽象类定义一个抽象方法指定如何调用
每个派生类按需要实现具体算法


-End-


 
posted on 2006-12-08 14:53  ColorSky  阅读(211)  评论(0编辑  收藏  举报