2017-06-05 58 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(); 
    } 
}