2017-11-23 11 views
0
public class ClassA_V01 { 
    private String name; 
    private int age; 

    // getter and setter 
} 

public class ClassA_V02 { 
    private String name; 
    private int age; 
    private int gender; 

    // getter and setter 
} 

public static void main(String[] args) { 
    SomeClass classA = new ClassA_V01(); 
    classA.setName("myName); 
    classA.setAge(99); 
    performLogic(classA); 

    // OR 
    SomeClass classA = new ClassA_V02(); 
    classA.setName("myName); 
    classA.setAge(99); 
    classA.setAge(1); 
    performLogic(classA); 
} 

public void performLogic(SomeClass classA) { 
    // do something 
} 

Damit das Strategiemuster funktioniert, müssen beide Klassen die gleichen Methoden implementieren, die in der Schnittstelle definiert sind. Was aber, wenn die Klassen unterschiedliche Felder und Methoden haben müssen?Java - Mögliche Verwendung von Strategie Design Pattern?

In meinem Beispiel ClassA_V01 und ClassA_V02 sind die gleichen Klasse der Ausnahme, dass ein weiteres Attribut „Geschlecht“ hat

Wie kann man die oben so implementieren, dass classA entweder ClassA_V01() oder ClassA_V02 gleich sein kann?

Antwort

0

"... 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.

Verwandte Themen