具有不同方法签名的策略模式

Mar*_*ace 5 design-patterns strategy-pattern

使用策略模式,如何根据具有不同参数的不同执行方法来区别对待?

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
}
Run Code Online (Sandbox Code Playgroud)

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

Nik*_*tak 1

使用策略模式,如何根据具有不同参数的不同执行方法来区别对待?

如果你让它以这种方式工作,它就不会被认为是一种strategy模式。事实上,您的客户知道不同的策略需要不同的参数,这使得策略模式无效,因为这样客户就被假定知道(至少部分地)特定策略在内部做什么。

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

function execute(param1, param2, param3) { }
Run Code Online (Sandbox Code Playgroud)

然而,如果你有更多的参数,这会变得很难看。您可以使用一个单独的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();
    }
}
Run Code Online (Sandbox Code Playgroud)