我不确定哪种设计模式可以帮助我解决此问题。
我有一个类“ Coordinator”,该类确定应使用哪种Worker类-不必知道那里有所有不同类型的Worker-它仅调用WorkerFactory并根据通用IWorker接口起作用。
然后,它将适当的Worker设置为工作并返回其“ DoWork”方法的结果。
到目前为止还不错。我们对新的Worker类有一个新的要求,即“ WorkerB”,它需要额外的信息量,即额外的输入参数,才能使其工作。
就像我们需要一个带有额外输入参数的DoWork方法重载...但是所有现有的Workers都必须实现该方法-这似乎是错误的,因为这些Workers确实不需要该方法。
我该如何重构,以使协调器不知道正在使用哪个工作人员,并且仍然允许每个工作人员获取完成其工作所需的信息,但没有任何工作人员执行不需要的信息?
已经有很多现有的工人。
我不想更改任何现有的具体Workers来适应新WorkerB类的要求。
我以为Decorator模式在这里会很好,但是我之前没有看到任何Decorator用相同的方法但参数不同来装饰对象...
代码情况:
public class Coordinator
{
public string GetWorkerResult(string workerName, int a, List<int> b, string c)
{
var workerFactor = new WorkerFactory();
var worker = workerFactor.GetWorker(workerName);
if(worker!=null)
return worker.DoWork(a, b);
else
return string.Empty;
}
}
public class WorkerFactory
{
public IWorker GetWorker(string workerName)
{
switch (workerName)
{
case "WorkerA":
return new ConcreteWorkerA();
case "WorkerB":
return new ConcreteWorkerB();
default:
return null;
}
}
}
public interface IWorker
{
string DoWork(int a, List<int> b);
}
public class ConcreteWorkerA : IWorker
{
public string DoWork(int a, List<int> b)
{
// does the required work
return "some A worker result";
}
}
public class ConcreteWorkerB : IWorker
{
public string DoWork(int a, List<int> b, string c)
{
// does some different work based on the value of 'c'
return "some B worker result";
}
public string DoWork(int a, List<int> b)
{
// this method isn't really relevant to WorkerB as it is missing variable 'c'
return "some B worker result";
}
}
Coordinator
已经必须更改以在其GetWorkerResult
功能中容纳该额外参数-这意味着违反了SOLID的Open-Closed-Principle。结果,所有代码调用Coordinator.GetWorkerResult
也必须更改。因此,请看一下调用该函数的位置:如何确定要请求哪个IWorker?这可能会导致更好的解决方案。
IWorker
界面中列出的旧版本,或者是一个新的版本,与添加的参数?