Das Strategy-Muster eignet sich gut, um große if ... else-Konstrukte zu vermeiden und das Hinzufügen oder Ersetzen von Funktionen zu vereinfachen. Dennoch bleibt meiner Meinung nach ein Fehler. Es scheint, dass es in jeder Implementierung noch ein Verzweigungskonstrukt geben muss. Es kann sich um eine Fabrik oder eine Datendatei handeln. Ein Beispiel ist ein Bestellsystem.
Fabrik:
// All of these classes implement OrderStrategy
switch (orderType) {
case NEW_ORDER: return new NewOrder();
case CANCELLATION: return new Cancellation();
case RETURN: return new Return();
}
Der Code danach muss sich keine Sorgen machen, und es gibt nur einen Ort, an dem Sie jetzt einen neuen Auftragstyp hinzufügen können, aber dieser Codeabschnitt ist immer noch nicht erweiterbar. Das Herausziehen in eine Datendatei trägt etwas zur Lesbarkeit bei (fraglich, ich weiß):
<strategies>
<order type="NEW_ORDER">com.company.NewOrder</order>
<order type="CANCELLATION">com.company.Cancellation</order>
<order type="RETURN">com.company.Return</order>
</strategies>
Dies fügt jedoch noch zusätzlichen Code für die Verarbeitung der Datendatei hinzu - gewährter, einfacher zu testender und relativ stabiler Code, aber dennoch zusätzliche Komplexität.
Außerdem ist diese Art von Konstrukt nicht gut für den Integrationstest geeignet. Jede einzelne Strategie ist jetzt möglicherweise einfacher zu testen, aber jede neue Strategie, die Sie hinzufügen, ist eine zusätzliche zu testende Komplexität. Es ist weniger als Sie es hätten, wenn Sie das Muster nicht verwendet hätten, aber es ist immer noch da.
Gibt es eine Möglichkeit, das Strategiemuster zu implementieren, das diese Komplexität verringert? Oder ist das so einfach wie es nur geht und der Versuch, weiter zu gehen, würde nur eine weitere Abstraktionsebene für wenig oder gar keinen Nutzen hinzufügen?
eval
... könnte nicht in Java funktionieren, aber vielleicht in anderen Sprachen?