继续我们的学习, 9章。Strategy模式
回顾我们的目标:
· 按接口编程
· 尽量用聚合代替继承
· 找出变化并封装之
Strategy模式
例:比如需要显示点,线,正方形,圆。
如果还需要一种带有特殊边线的正方形,我们从正方形继承,重用Square中的代码,只是覆盖DrawBorder方法。
导致的问题:
弱内聚: 如果有许多边线类型,Square还要关心所有的边线绘制。
减少复用可能性 当我们为不同边线编写了代码,并加入Square及其派生类,怎样才能将这些代码复用于其它形状呢?
无法根据变化很好的伸缩 如果需求变更,要求两种不同的底纹怎么办?为了应对所有选择,要不断特化Square
优秀的解决方法:
标准图:
意图 可以根据上下文,使用不同的业务规则和算法
问题 对所需算法的选择取决于发出请求的客户或要处理的数据,算法预料会发生变化。
解决方案 将算法封装到一个单独的类中
将这个算法类包含在客户对象中
参与者和协作者 Strategy指定了如何使用不同的算法
各Concrete Strategy 实现了这些不同的算法
Context通过类型为Strategy的引用使用具体的Concrete Strategy对象。
Context将来自客户的请求发个Strategy
效果 必须以相同的接口调用所有算法
分离了业务规则和客户对象
定义了一系列算法
避免使用Switch语句
实现 让使用算法的类(Context)包含一个抽象策略类(Strategy)
该抽象类定义一个抽象方法指定如何调用
每个派生类按需要实现具体算法
-End-
回顾我们的目标:
· 按接口编程
· 尽量用聚合代替继承
· 找出变化并封装之
Strategy模式
例:比如需要显示点,线,正方形,圆。
如果还需要一种带有特殊边线的正方形,我们从正方形继承,重用Square中的代码,只是覆盖DrawBorder方法。
导致的问题:
弱内聚: 如果有许多边线类型,Square还要关心所有的边线绘制。
减少复用可能性 当我们为不同边线编写了代码,并加入Square及其派生类,怎样才能将这些代码复用于其它形状呢?
无法根据变化很好的伸缩 如果需求变更,要求两种不同的底纹怎么办?为了应对所有选择,要不断特化Square
优秀的解决方法:
标准图:
意图 可以根据上下文,使用不同的业务规则和算法
问题 对所需算法的选择取决于发出请求的客户或要处理的数据,算法预料会发生变化。
解决方案 将算法封装到一个单独的类中
将这个算法类包含在客户对象中
参与者和协作者 Strategy指定了如何使用不同的算法
各Concrete Strategy 实现了这些不同的算法
Context通过类型为Strategy的引用使用具体的Concrete Strategy对象。
Context将来自客户的请求发个Strategy
效果 必须以相同的接口调用所有算法
分离了业务规则和客户对象
定义了一系列算法
避免使用Switch语句
实现 让使用算法的类(Context)包含一个抽象策略类(Strategy)
该抽象类定义一个抽象方法指定如何调用
每个派生类按需要实现具体算法
-End-