论坛首页 Java企业应用论坛

提问:使用策略模式的烦恼,要实现208个类

浏览 42214 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-09-20  
  我的环境是这样的:
  一个工资系统,有13种人员,每种人员工资包含4个组成部分,而对所有种类的人员,有16种工资变动。
  如果用策略模式:
  好处:增加一种人员或者增加一种工资变动,都不需要修改原有代码。
  坏处:如确定种类的人员变动一次工资就有一个算法实现,要实现太多的类 13 × 16 = 208  个,有什么好的办法啊?
  
   
   发表时间:2006-09-20  
规则引擎行不?
0 请登录后投票
   发表时间:2006-09-20  
规则引擎当然好,当也要定义规则。而我们现在对规则引擎不熟悉,时间较紧张,所以还是想如何既用策略模式,类又少?
0 请登录后投票
   发表时间:2006-09-20  

Composite Pattern, 类型线性增长。13 + 16种就行了。

现有代码可以抽象出来,大家帮你重构一下。
0 请登录后投票
   发表时间:2006-09-20  
类如图,AChange代表工资变动,Argith代表算法.共有16种AChange,BChange,CChange.......,而16种变动中,每种又有13种Argith不同的变动算法,这样就要13 × 16 = 208 个 实现Argith的类了.例如一种工资变动是"工资调整",对应有13种人的"工资调整"算法,每种人因工资构成不同及工资调整规则不同,就有13个类了,这样后,
另一种工资变动是"升职变动",对应有13种人的"升职变动"算法,每种人因工资构成不同及升职变动规则不同,就又有13个类了,
如此下去,16种变动就有208个算法类了.
  • 大小: 1 MB
0 请登录后投票
   发表时间:2006-09-20  
看不懂这个图。好像变化部分有两个,一个是Change, 一个是Algorithm。
这么说吧,看看能不能拆出来一个 ChangeAlgorithm。

ChangeAlgorithm有两个属性,一个是change,一个是algorithm。
另外有13个ChangeImpl类,16个AlgorithmImpl类。

那么对于每一个( Change, Algorithm ) pair都有一个对应的

ChangeAlgorithm( change, algorithm )。

意思就是说,不要用继承来重用代码,而是利用成员变量或者参数来重用代码。



0 请登录后投票
   发表时间: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个算法类了.
"
0 请登录后投票
   发表时间:2006-09-20  
遇到这种乘法的难题应该首先想到包装模式(decorator),<Head First Design Patterns>的例子就很好
0 请登录后投票
   发表时间:2006-09-21  
如果无法将13×16种算法抽出核心的几种,然后用这几种来组合,想满足testhubo 的要求系不可能的。
建议你再把具体算法描述清楚些
ps:ajoo最喜欢搞这种组合式的东西了,建议召唤Ta
0 请登录后投票
   发表时间:2006-09-21  
怎么就出现了 13 × 16 = 208 个类?
只有采用继承,才可能出现这种类型膨胀。而且是两重继承,才能达到这个惊人的类型膨胀效果。

前面的意思是,采用组合(属性,参数,IoC)来实现代码重用。
那么结果就是 13 + 16 = 29 个类。

这29类可以进行组合,可以组合出来13 × 16 = 208 种 Instance。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics