2009-11-13 6 views
2

Je veux développer un système similaire au calcul du salaire. Un salaire a une valeur de base. En plus, un employé peut obtenir des Bonus ou des Pénalités. Décorateur Motif semble correspondre à ce scénarioCalculs de salaire Modèles

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

En outre, je veux enregistrer le résultat de chaque calcul. Donc, à la fin, même après le calcul, je peux récupérer combien était LateComingPenalty.

Il semble que ce soit un problème courant lorsque ce type de calcul de facture est impliqué. Il peut y avoir de meilleures options que Pattern de motif. Avez-vous de meilleures suggestions?

Répondre

7

Cela ressemble à un peu de sur-ingénierie. Je pourrais suggérer:

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

En adjustments vous pouvez ajouter votre HardworkBonus et LatePenalty ou tout autre chose, et les récupérer plus tard.

+1

+1 pour le commentaire de sur-ingénierie. Parfois, le motif décorateur est vraiment horrible – RichardOD

+0

Probablement préférable d'utiliser un type de précision arbitraire comme BigDecimal pour un montant monétaire. –

+0

Merci pour la réponse, mais ne manquerait pas l'effet "sur le dessus". Peut-être que j'ai trop simplifié le problème. Chaque composante fonctionne sur une base qui n'est pas nécessairement le salaire de base. Par exemple, si nous avons un salaire de base, premier bonus = 2% de base, deuxième bonus = 1% du premier bonus, pénalité de dommages = 1% de base, pénalité de retard = 10% de la somme courante jusqu'à présent, impôt sur le revenu = 16% de somme etc. Ainsi l'ordre de calcul est important et le calcul devrait être effectué une fois. Je peux initialiser SalaryAdjustment avec la base de calcul, mais le calcul doit être effectué plus d'une fois. – anergy