欢迎来到天天文库
浏览记录
ID:39656144
大小:708.50 KB
页数:55页
时间:2019-07-08
《java装饰模式资料》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、Java装饰模式(Decorator)1 场景问题1.1 复杂的奖金计算 考虑这样一个实际应用:就是如何实现灵活的奖金计算。 奖金计算是相对复杂的功能,尤其是对于业务部门的奖金计算方式,是非常复杂的,除了业务功能复杂外,另外一个麻烦之处是计算方式还经常需要变动,因为业务部门经常通过调整奖金的计算方式来激励士气。 先从业务上看看现有的奖金计算方式的复杂性:·首先是奖金分类:对于个人,大致有个人当月业务奖金、个人累计奖金、个人业务增长奖金、及时回款奖金、限时成交加码奖金等等;·对于业务主管或者是业
2、务经理,除了个人奖金外,还有:团队累计奖金、团队业务增长奖金、团队盈利奖金等等。·其次是计算奖金的金额,又有这么几个基数:销售额、销售毛利、实际回款、业务成本、奖金基数等等;·另外一个就是计算的公式,针对不同的人、不同的奖金类别、不同的计算奖金的金额,计算的公式是不同的,就算是同一个公式,里面计算的比例参数也有可能是不同的。 1.2 简化后的奖金计算体系 看了上面奖金计算的问题,所幸我们只是来学习设计模式,并不是真的要去实现整个奖金计算体系的业务,因此也没有必要把所有的计算业务都罗列在这里,为了后面演示的需要,简化
3、一下,演示用的奖金计算体系如下:·每个人当月业务奖金=当月销售额X 3%·每个人累计奖金=总的回款额X 0.1%·团队奖金=团队总销售额X1% 1.3 不用模式的解决方案 一个人的奖金分成很多个部分,要实现奖金计算,主要就是要按照各个奖金计算的规则,把这个人可以获取的每部分奖金计算出来,然后计算一个总和,这就是这个人可以得到的奖金。(1)为了演示,先准备点测试数据,在内存中模拟数据库,示例代码如下:01/**02 *在内存中模拟数据库,准备点测试数据,好计算奖金03 */04publicclassTempDB{05
4、 privateTempDB(){06}07 /**08 *记录每个人的月度销售额,只用了人员,月份没有用09 */10 publicstaticMapmapMonthSaleMoney= 11newHashMap();12 static{13 //填充测试数据14 mapMonthSaleMoney.put("张三",10000.0);15 mapMonthSaleMoney.put("李
5、四",20000.0);16 mapMonthSaleMoney.put("王五",30000.0);17 }18} (2)按照奖金计算的规则,实现奖金计算,示例代码如下: 01/**02 *计算奖金的对象03 */04publicclassPrize{05 /**06 *计算某人在某段时间内的奖金,有些参数在演示中并不会使用,07 *但是在实际业务实现上是会用的,为了表示这是个具体的业务方法,08 *因此这些参数被保留了09 *@paramuser被计算奖金的人员10
6、 *@parambegin计算奖金的开始时间11 *@paramend计算奖金的结束时间12 *@return某人在某段时间内的奖金13 */14 public doublecalcPrize(Stringuser,Datebegin,Dateend){15 doubleprize=0.0; 16 //计算当月业务奖金,所有人都会计算17 prize=this.monthPrize(user,begin,end);18 //计算累计奖金1
7、9 prize+=this.sumPrize(user,begin,end);20 21 //需要判断该人员是普通人员还是业务经理,团队奖金只有业务经理才有22 if(this.isManager(user)){23 prize+=this.groupPrize(user,begin,end);24 }25 returnprize;26 }27 28 /**29 *计算某人的当月业务奖金,参数重复,
8、就不再注释了30 */31 privatedoublemonthPrize(Stringuser,Datebegin,Dateend){32 //计算当月业务奖金,按照人员去获取当月的业务额,然后再乘以3%33 doub
此文档下载收益归作者所有