Mit dem Strategie-Muster, wie können verschiedene exteutute Methoden unterschiedlich in Bezug auf sie unterschiedliche Parameter behandeln?
Wenn Sie es so machen, wird es nicht als strategy
Muster betrachtet werden. Die Tatsache, dass Ihr Kunde unterschiedliche Strategien kennt, erfordert andere Parameter, macht das Strategiemuster ungültig, weil dann angenommen wird, dass der Kunde (zumindest teilweise) weiß, welche spezifische Strategie er intern hat.
Verstehen, dass Strategie Parameter nicht selektiv akzeptieren sollte. Es sollte stattdessen selektiv an den Parametern arbeiten. Bevor Sie also weiterlesen, sollten Sie bedenken, dass wir jetzt alle Strategien haben, die alle Parameter akzeptieren. So dass Strategy1
verwendet nur param1
und param2
und ignoriert param3
, und so weiter.
function execute(param1, param2, param3) { }
Allerdings wird dieses hässliche wenn Sie noch mehr Parameter. Sie können stattdessen eine separate Klasse Parameter
verwenden und diese Sammlung von Parametern an jede Strategie übergeben. Jede Strategie enthält eine Logik zum Abrufen und Verwenden von Parametern, die sie benötigt, und ignoriert den Rest.
dann tun sie etwas allgemein gehalten, dass jede Strategie
tun Das ist, was Sie für abstrakte Strategie haben kann. Es enthält abstract execute()
Methode und es ist execute()
eigene Methode, die jede konkrete Strategie aufrufen wird.
Zusammengefasst ist hier, wie es wie (nicht übersetzbar Code) aussehen:
Main()
{
AbstractStrategy s = new ConcreteStrategy1();
s.Execute(parameters); // parameters -> collection
}
class AbstractStrategy {
Execute(parameters); // abstract
Execute() {} // not public
}
class ConcreteStrategy1 : AbstractStrategy {
override Execute(parameters) {
string pvalue1 = parameters.GetValue("param1");
base.Execute();
}
}
Wie Sie herausfinden, was die Parameter jeder Funktion Bedürfnisse? Die Parameterauswahl muss Teil der Strategie und nicht Teil der Schnittstelle sein. –
Können Sie bei der Erstellung der Strategie alle erforderlichen Daten übergeben und Parameter aus der Strategieoberfläche entfernen? Wenn Sie dies tun können, dann verschieben Sie vielleicht auch den generischen Teil des Algorithmus zu einer abstrakten Basisstrategie. Alternativ kann Ihre Strategie-Schnittstelle ein Paket von Daten (1 Modell/Objekt) erwarten und die Strategie-Implementierungen verwenden selektiv Teile davon. – Reasurria