2009-11-13 56 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