"... Damit das Strategiemuster funktioniert, müssen beide Klassen die gleichen Methoden implementieren, die in der Schnittstelle definiert sind. Aber was ist, wenn die Klassen unterschiedliche Felder und Methoden haben? ..." Das ist wirklich kein Kriterien für das Strategie-Muster.
Strategie Absicht ist zu identifizieren und Familie von Algorithmen austauschbar machen. Wenn Sie die Dokumentation des Musters sorgfältig lesen, kann Strategie verwendet werden, wenn viele verwandte Klassen nur in ihrem Verhalten unterscheiden.
Entsprechende Zerlegung ist der Schlüssel für ein besseres (erweiterbares) Design. Eine typische (aber primitive) Lösung zu Employee Zuweisung, Sub-Classing TempEmp und PermanentEmp-Typen wird uns in Schwierigkeiten bringen und wird nicht zulassen, Temp-Mitarbeiter in seiner Lebenszeit dauerhaft zu werden (was in realen Begriffen keine Bedeutung hat). Dies geschieht, weil wir einen wichtigen Punkt verpassen - jeder Mitarbeiter Mitarbeiterschaft ist nicht anders, sie sind alle von der gleichen Art von Mitarbeitern mit verschiedenen Pay-Richtlinien. (Die gleiche Logik kann für die Urlaubsrichtlinie und so weiter erweitert werden.)
Dies wird einfach, wenn alle Arten von Mitarbeitern Gehaltsberechnung basierend auf denselben Komponenten (gleicher Status) haben. Aber Ihre Frage ist, ob TempEmployee nur basicPay bekommt, während PermanentEmployee sowohl basicPay als auch travelAllowance (zusätzliches Attribut, das für TempEmp nicht vorhanden ist) bekommt. Dies kann durch eine Kombination von einfacher Vererbungshierarchie modelliert wird zusammen mit Strategie des Berechnungsalgorithmus der Pflege abhängig Mitarbeiter (aka. Context) Attribut (Alter)
public class Employee {
//name and id
private PayPackage payPackage;
private int age;
PayPackage strategy;
public double computeSalary() {
return payPackage.computePay(age);
}
//get/setPayPackage(...)
}
public abstract class PayPackage {
private double basicPay;
abstract public double computePay(int age);
protected double getBasicPay(){
return basicPay;
}
}
public class TempPayPackage extends PayPackage{
@Override
public double computePay(int age) {
double veteranAllowance = 0;
if (age > 40) {
veteranAllowance = 2000.00;
}
return getBasicPay() + veteranAllowance;
}
}
public class PermanentPayPackage extends PayPackage{
private double travelAllowance;
@Override
public double computePay(int age) {
double veteranAllowance = 0;
if (age > 40) {
veteranAllowance = 5000.00;
}
return getBasicPay() + travelAllowance + veteranAllowance;
}
}
wichtige Sache zu erinnern ist, Entwurfsmuster nie alleine arbeiten oder als Als Alternative arbeiten sie Hand in Hand mit objektorientiertem Code und anderen Mustern.