2009-11-13 55 views
2

我想开发一个类似于工资计算的系统。薪水具有基本价值。最重要的是,员工可以获得一些奖励或罚则。装饰模式似乎适合这种情况工资计算模式

Salary finalSalary = new HardworkBonus(new LateComingPenalty(new BasicSalary())) 
System.out.println("Your total salary is : "+ finalSalary.calculate()) 

此外,我想保存每个计算的结果。所以最后,即使在计算之后,我可以检索LateComingPenalty有多少。

这似乎是一个共同的问题,即这种类型的发票计算的是involved.There可能是一些比装饰Pattern.Do更好的选择,你有更好的建议?

回答

7

这似乎是有点过度设计的。我可能会建议:

class Salary { 
    double base; 
    SalaryAdjustment[] adjustments; 
    double getSalary() { 
     double r = base; 
     for (SalaryAdjustment a: adjustments) { 
      r += a.getAdjustment(); 
     } 
     return r; 
    } 
}; 

adjustments您可以添加您HardworkBonusLatePenalty或任何其他的,后来检索。

+1

+1为过度评论。有时装饰模式真的很可怕 – RichardOD 2009-11-13 10:59:16

+0

可能最好使用像BigDecimal这样的任意精度类型来支付金额。 – 2009-11-13 13:11:12

+0

感谢您的回答,但不会错过“最重要的”影响。也许我过分简化了这个问题。每个组成部分都以某种基础运作,这不一定是基本工资。例如,如果我们有基本工资,第一笔奖金=基数的2%,第二笔奖金=第一笔奖金的1%,损失罚款=基数的1%,逾期罚款=到现在为止的10%,所得税= 16%因此计算顺序很重要,计算应该执行一次。我可以用计算的基础初始化SalaryAdjustment,但是这个Calc需要多次执行。 – anergy 2009-11-13 14:02:53