策略模式与不同的方法签名

时间:2017-06-05 22:15:00

标签: design-patterns strategy-pattern

使用策略模式,如何以不同的参数来区分不同的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
}

所有人都做了非常具体的事情,但需要不同的参数,然后他们做一些通用的事情,每个策略都会做。

2 个答案:

答案 0 :(得分:0)

  

使用策略模式,如何处理不同的exectute方法   它们具有不同的参数有何不同?

如果以这种方式使其工作,则不会将其视为strategy模式。您的客户知道不同策略的事实需要不同的参数,使策略模式无效,因为假设客户知道(至少部分)内部特定策略的作用。

了解策略不应选择性地接受参数。它应该选择性地处理参数。因此,在您进一步阅读之前,请考虑我们现在所有策略都接受所有参数。因此Strategy1仅使用param1param2而忽略param3,依此类推。

function execute(param1, param2, param3) { }

然而,如果您有更多参数,这会变得很难看。您可以改为使用单独的Parameter类,并将此参数集合传递给每个策略。每个策略都包含一个逻辑来获取和使用它所需的参数,并忽略休息。

  

然后他们做一些通用的事情,每个策略都会做

这就是你可以有的抽象策略。它将包含abstract execute()方法和每个具体策略将调用的自己的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();
    }
}

答案 1 :(得分:0)

如果您需要将一个操作的输出用作其他操作的输入,并且在此过程中如果参数数量及其类型发生变化,则可以考虑采用以下设计。

[伪代码]

    接口IProcess // //您可以在此处抽象出具有共同签名的操作,     如果     //需要

class ProcessOne : IProcess
{
private IProcess nextProcess = new ProcessTwo()
public retVal1 Execute(param1, param2)
{
//ProcessOne Logic
retVal1 retval =  nextProcess.Execute(param1);
return retval;
}
}

然后实施工厂以构造链接的IProcess类型。 从工厂获取包装的IProcess实例,然后对其调用Execute。 在nextProcess实例和级联输出上内部调用链式Execute操作。

工厂使您可以在每个级别使用相同签名的不同实现。