锁定老帖子 主题:提问:使用策略模式的烦恼,要实现208个类
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-09-20
一个工资系统,有13种人员,每种人员工资包含4个组成部分,而对所有种类的人员,有16种工资变动。 如果用策略模式: 好处:增加一种人员或者增加一种工资变动,都不需要修改原有代码。 坏处:如确定种类的人员变动一次工资就有一个算法实现,要实现太多的类 13 × 16 = 208 个,有什么好的办法啊? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-09-20
规则引擎行不?
|
|
返回顶楼 | |
发表时间:2006-09-20
规则引擎当然好,当也要定义规则。而我们现在对规则引擎不熟悉,时间较紧张,所以还是想如何既用策略模式,类又少?
|
|
返回顶楼 | |
发表时间:2006-09-20
Composite Pattern, 类型线性增长。13 + 16种就行了。 现有代码可以抽象出来,大家帮你重构一下。 |
|
返回顶楼 | |
发表时间:2006-09-20
类如图,AChange代表工资变动,Argith代表算法.共有16种AChange,BChange,CChange.......,而16种变动中,每种又有13种Argith不同的变动算法,这样就要13 × 16 = 208 个 实现Argith的类了.例如一种工资变动是"工资调整",对应有13种人的"工资调整"算法,每种人因工资构成不同及工资调整规则不同,就有13个类了,这样后,
另一种工资变动是"升职变动",对应有13种人的"升职变动"算法,每种人因工资构成不同及升职变动规则不同,就又有13个类了, 如此下去,16种变动就有208个算法类了. |
|
返回顶楼 | |
发表时间:2006-09-20
看不懂这个图。好像变化部分有两个,一个是Change, 一个是Algorithm。
这么说吧,看看能不能拆出来一个 ChangeAlgorithm。 ChangeAlgorithm有两个属性,一个是change,一个是algorithm。 另外有13个ChangeImpl类,16个AlgorithmImpl类。 那么对于每一个( Change, Algorithm ) pair都有一个对应的 ChangeAlgorithm( change, algorithm )。 意思就是说,不要用继承来重用代码,而是利用成员变量或者参数来重用代码。 |
|
返回顶楼 | |
发表时间:2006-09-20
buaawhl 写道 看不懂这个图。好像变化部分有两个,一个是Change, 一个是Algorithm。
不好意思,写的比较急躁,就不太清楚了.上面的已经修改如下了,请赐教.
这么说吧,看看能不能拆出来一个 ChangeAlgorithm。 ChangeAlgorithm有两个属性,一个是change,一个是algorithm。 另外有13个ChangeImpl类,16个AlgorithmImpl类。 那么对于每一个( Change, Algorithm ) pair都有一个对应的 ChangeAlgorithm( change, algorithm )。 意思就是说,不要用继承来重用代码,而是利用成员变量或者参数来重用代码。 "类如图,AChange代表工资变动,Argith代表算法.共有16种AChange,BChange,CChange.......,而16种变动中,每种又有13种Argith不同的变动算法,这样就要13 × 16 = 208 个 实现Argith的类了.例如一种工资变动是"工资调整",对应有13种人的"工资调整"算法,每种人因工资构成不同及工资调整规则不同,就有13个类了,这样后, 另一种工资变动是"升职变动",对应有13种人的"升职变动"算法,每种人因工资构成不同及升职变动规则不同,就又有13个类了, 如此下去,16种变动就有208个算法类了. " |
|
返回顶楼 | |
发表时间:2006-09-20
遇到这种乘法的难题应该首先想到包装模式(decorator),<Head First Design Patterns>的例子就很好
|
|
返回顶楼 | |
发表时间:2006-09-21
如果无法将13×16种算法抽出核心的几种,然后用这几种来组合,想满足testhubo 的要求系不可能的。
建议你再把具体算法描述清楚些 ps:ajoo最喜欢搞这种组合式的东西了,建议召唤Ta |
|
返回顶楼 | |
发表时间:2006-09-21
怎么就出现了 13 × 16 = 208 个类?
只有采用继承,才可能出现这种类型膨胀。而且是两重继承,才能达到这个惊人的类型膨胀效果。 前面的意思是,采用组合(属性,参数,IoC)来实现代码重用。 那么结果就是 13 + 16 = 29 个类。 这29类可以进行组合,可以组合出来13 × 16 = 208 种 Instance。 |
|
返回顶楼 | |