Ich versuche, das Strategiemuster zu verstehen und frage mich: Ist die Kontextklasse ein Muss oder kann ich sie weglassen, ohne den Zweck des Musters zu beeinträchtigen?
Ich hatte den Eindruck, ich brauchte eine Art Schalter zum Lesen verschiedener Dateitypen, wollte aber nicht nur etwas hacken und mich später mit Refactoring befassen (obwohl es natürlich immer vorkommt, dass Code refactored werden kann, aber die Idee war: try um vorher so schlau wie möglich im Design zu sein ...):
Bild aus Wikimedia genommen
Kann der Client direkt an die Strategieoberfläche delegieren oder gibt es etwas, das ich gerade über die Kontextklasse nicht verstanden habe?
interface Reader {
// read information from file and fill data list field of Client
readFile();
}
class ExcelReader implements Reader{ /* */ }
class PdfReader implements Reader{ /* */}
class Client{
// strategic choice
Reader r;
// data list field
List<Data> data;
// Client Constructor
public Client(){
if(<file ends in .xls>)
r = new ExcelReader();
else
r = new PdfReader();
r.readFile();
}
}
Oben abgebildet fehlt also die Kontextklasse. Entspricht der Code dem Strategiemuster?
design-patterns
strategy
Panny
quelle
quelle
Antworten:
In Ihrem Beispiel ist der Codeaufruf
readFile
Teil des Client-Konstruktors. Diese Methode ist der "Kontext", den Sie suchen . Das Strategiemuster benötigt buchstäblich keine "Kontextklasse", und in der ersten Version Ihres Codes befindet sich das Strategieobjekt (in Ihrem Fall der "Reader") möglicherweise nur in einer lokalen Variablen. Besonders wenn nur eine "strategische Methode" ("readFile") aufgerufen werden muss.Wenn Ihre Codebasis jedoch von einer Version zur nächsten wächst, ist es nicht unwahrscheinlich, dass immer mehr "strategische" Methoden aufgerufen werden. Die Entscheidung, welche Strategie angewendet werden soll, und die Durchführung der "strategischen Methoden" werden zu unterschiedlichen Zeiten erfolgen und an verschiedenen Stellen in Ihrem Code. Also fängst du an, sie umzugestalten, um die Logik an einem Ort zu halten. Dies führt direkt zu einer Implementierung, die dem Diagramm in Ihrer Frage ähnelt.
quelle
Bestimmt. Muster sind nur Richtlinien. Sie müssen sie noch anpassen und korrekt auf das jeweilige Problem anwenden. Persönlich erlaube ich selten, dass die Strategie zur Laufzeit festgelegt wird. häufiger wird es beim Bau spezifiziert oder in einer Fabrik gesponnen.
Es könnte aber auch argumentiert werden, dass dies
setStrategy
privat ist und meine Injektion nur das gezeigte Muster verwendet.quelle