1

我有三种类型的算法,每种都采用不同的参数类型进行处理。

class AlgorithmA
{
    Execute(int param);
}

class AlgorithmB
{
    Execute(string param);
}

class AlgorithmC
{
    Execute();
}

为了使用 MEF 的策略模式,我做了以下事情:

interface IAlgorithm
{
    int IntegerParam{get;set;}
    string StringParam{get;set;}
    string AlgorithmName {get;}
    void Execute();
}

在客户端:

[ImportMany]
IEnumerable<IAlgorithm> Algorithms { get; set; }

IAlgorithm algorithm=Algorithms.Single(a => a.AlgorithmName == name);
algorithm.IntegerParam=integerParam;
algorithm.StringParam=stringParam;
algorithm.Execute();

现在的问题是,提供必要的参数作为属性显然是错误的,但另一方面,如果我将它们作为构造函数参数提供,它将违背模式的目的。
你会怎么做 ?

4

2 回答 2

1

策略模式应该将相同的参数传递给它的策略,而不管实际选择的是什么;然后,每个策略都应该决定如何处理这些参数。

如果您需要传递两个参数,您可能应该定义如下内容:

interface IAlgorithm
{
    string AlgorithmName {get;}
    void Execute(string paramA, int paramB);
}

algorithm.Execute(stringParam, intParam);

那么如果某个策略只需要使用第一个参数,那么它就简单地使用它而忽略另一个参数。

我认为你缺少的是,如果你尝试将不同的参数传递给不同的策略,那么你几乎放弃了这里的策略,因为你已经知道了一些关于正在使用的策略,它是如何在内部工作的以及它是什么需要。

于 2012-11-24T13:38:35.977 回答
0

这可能是您问题的解决方案:http ://www.hillside.net/plop/2010/papers/sobajic.pdf

于 2013-10-02T23:45:05.053 回答