2017-06-05 59 views
0

使用策略模式,如何以不同的參數對待不同的execute方法?具有不同方法簽名的策略模式

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

使用策略模式,如何在不同的參數方面對待不同的執行方法 ?

如果以這種方式工作,它將不被視爲strategy模式。事實上你的客戶知道不同的策略需要不同的參數,使策略模式無效,因爲假設客戶知道(至少部分)內部具體的策略。

瞭解該策略不應該有選擇地接受參數。它應該選擇性地處理參數。因此,直到您進一步閱讀,請考慮我們現在有所有策略接受所有參數。因此,Strategy1僅使用param1param2,並忽略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(); 
    } 
}