2017-06-05 12 views
0

ストラテジパターンを使用すると、さまざまなexectuteメソッドを異なるパラメータで異なる方法で扱うことができますか?異なるメソッドシグネチャを持つストラテジパターン

3例戦略

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 
} 

すべては、彼らがすべての戦略がどうなるという一般的な何かをする、非常に具体的な何かをするが、このために異なるパラメータを必要としています。

+0

あなたはパラメータは、各機能が必要なものをどのように把握できますか?パラメータの選択は、戦略の一部であり、インタフェースの一部ではありません。 –

+0

戦略構築時に必要なすべてのデータを渡し、戦略インタフェースからパラメータを削除することは可能ですか?これを行うことができれば、おそらくアルゴリズムのジェネリック部分を抽象基本戦略に移すこともできます。あるいは、戦略インタフェースにデータパッケージ(1つのモデル/オブジェクト)が必要であり、ストラテジ実装でその一部を選択的に使用させることができます。 – Reasurria

答えて

0

戦略パターンを使用すると、さまざまなexectuteメソッド を異なるパラメータで扱う方法が異なりますか?

このように動作させると、strategyパターンとはみなされません。クライアントは異なる戦略を知っているということを知っているため、戦略パターンを無効にします。

戦略がパラメータを選択的に受け入れるべきではないことを理解してください。代わりに、パラメータを選択的に処理する必要があります。ですから、さらに読む前に、すべてのパラメータを受け入れるすべての戦略を持っていると考えてください。したがって、Strategy1param1param2のみを使用し、param3などは無視します。

function execute(param1, param2, param3) { } 

さらに多くのパラメータがある場合、これは醜いです。代わりに、別のParameterクラスを持ち、この一連のパラメータをすべての戦略に渡すことができます。各戦略には、必要なパラメータを取得して使用するロジックが含まれ、残りは無視されます。

そして、彼らはすべての戦略は、あなたがのための抽象的な戦略を持つことができるものです

を尽くすことを、一般的な何かをします。これにはabstract execute()メソッドが含まれており、それぞれの具体的な戦略が呼び出す方法は​​です。要約する

は、ここでは(非コンパイルコード)のようになります方法は次のとおりです。

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(); 
    } 
} 
関連する問題