2017-06-05 5 views
0

Mit dem Strategie-Pattern, wie können verschiedene extreme Methoden unterschiedlich mit unterschiedlichen Parametern behandelt werden?Strategie-Pattern mit verschiedenen Methodensignaturen

3 Beispiel Strategien

public function execute(string $param1, string $param2) 
{ 
    // Do something specific to this method 
    // 


    // Do some generic things across all strategies 
    // 
} 

public function execute(string $param1) 
{ 
    // Do something specific to this method 
    // 


    // Do some generic things across all strategies 
    // 
} 


public function execute() 
{ 
    // Do something specific to this method 
    // 


    // Do some generic things across all strategies 
} 

Das alles tun etwas ganz Konkretes, sondern erfordern unterschiedliche Parameter für diese, dann tun sie etwas allgemein gehalten, dass jede Strategie tun.

+0

Wie Sie herausfinden, was die Parameter jeder Funktion Bedürfnisse? Die Parameterauswahl muss Teil der Strategie und nicht Teil der Schnittstelle sein. –

+0

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

Antwort

0

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(); 
    } 
} 
Verwandte Themen