我有很多实现不同算法的不同引擎。它们都实现了相同的接口,但具有不同的配置方法。大部分都是不带参数配置的,有的只带一个整数,少的带两个整数。将来我们将有三个甚至四个整数的可能性很小。
我需要创建一个引擎控制器来决定何时必须启动或停止引擎,因为这对所有引擎都很常见。我认为的选项如下:
- 创建一个独特的接口,其参数与可用的最大配置方法一样多,并忽略引擎中不需要的参数。这样我就只有一个EngineController。
- 为每个不同的配置方法创建一个接口,并为每个不同的接口创建一个 EngineController(但这将使我创建很多只在参数数量上有所不同的类,并且每次新的类都需要 2 个新类参数被添加到引擎。
- ...
我真的对这两种解决方案中的任何一种都不满意,因为传递不需要的参数看起来很“丑陋”,并且由于使用第二个选项生成的类数量众多(只有很小的差异)。
有什么设计或模式可以避免这个问题?
编辑(感谢您的回答,此编辑回答了所有问题并澄清了问题):
举个例子,这些是引擎。
abstract class EngineBase
{
public void Start() {...}
public void Stop() {...}
}
class EngineOne : EngineBase
{
public void Configure(int parameter1) {...};
}
class EngineTwo : EngineBase
{
public void Configure(int parameter1, int parameter2) {...};
}
class EngineThree : EngineBase
{
public void Configure(int parameter1, int parameter2, int parameter3) {...};
}
由于所有引擎都有相同的逻辑来决定何时开始或结束,我想创建一个处理它们的新类,称为 EngineController。控制器将在需要时调用配置、启动和停止:
class EngineController
{
EngineBase _engine; ??? or what?
void SuperviseEngine() { ... _engine.Configure(x,x,...) ... _engine.Start() ...
}
我的第一个想法是在 EngineBase 类中添加下一个方法:
abstract class EngineBase
{
public void Start() {...}
public void Stop() {...}
public void Configure(int parameter1, int parameter2, int parameter3) {...}
}
class EngineController
{
EngineBase _engine;
void SuperviseEngine() { ... _engine.Configure(x,y,z) ... _engine.Start() ...
}
并忽略不需要的参数,但我不喜欢这个主意。然后我想到了做以下事情:
interface I1ParameterConfigurable
{
public void Configure(int parameter1) {...};
}
interface I2ParameterConfigurable
{
public void Configure(int parameter1, int parameter2) {...};
}
interface I3ParameterConfigurable
{
public void Configure(int parameter1, int parameter2, int parameter3) {...};
}
然后为每种引擎创建 3 个不同的控制器:
class EngineController1Parameter
{
EngineBase _engine;
I1ParameterConfigurable _configurableEngine = _engine as I1ParameterConfigurable;
void SuperviseEngine() { ... _configurableEngine .Configure(x) ... _engine.Start()
}
class EngineController2Parameter
{
EngineBase _engine;
I2ParameterConfigurable _configurableEngine = _engine as I2ParameterConfigurable;
void SuperviseEngine() { ... _configurableEngine .Configure(x, y) ... _engine.Start()
}
你明白了,但我觉得这会创建很多接口/类,也许有办法避免这种情况。
感谢您的回答,我有了第三个选项,它类似于第一个选项,但使用数组(或 IEnumerable 或其他)来传递未定义数量的参数。这个想法不错,但是我会丢失参数名称。但也许这是迄今为止最好的选择。