Non sono sicuro di quale schema di progettazione possa aiutarmi a risolvere questo problema.
Ho una classe, "Coordinator", che determina quale classe Worker dovrebbe essere utilizzata - senza dover conoscere tutti i diversi tipi di Worker che ci sono - chiama semplicemente WorkerFactory e agisce sull'interfaccia comune di IWorker.
Quindi imposta il Worker appropriato affinché funzioni e restituisce il risultato del suo metodo 'DoWork'.
Questo è andato bene ... fino ad ora; abbiamo un nuovo requisito per una nuova classe Worker, "WorkerB" che richiede un'ulteriore quantità di informazioni, ovvero un parametro di input aggiuntivo, affinché faccia il suo lavoro.
È come se avessimo bisogno di un metodo DoWork sovraccarico con il parametro di input aggiuntivo ... ma poi tutti i Workers esistenti dovrebbero implementare quel metodo - che sembra sbagliato in quanto quei lavoratori non hanno davvero bisogno di quel metodo.
Come posso refactoring questo per mantenere il coordinatore ignaro di quale lavoratore viene utilizzato e ancora consentendo a ciascun lavoratore di ottenere le informazioni necessarie per svolgere il suo lavoro ma non ha nessun lavoratore fare cose di cui non ha bisogno?
Ci sono già molti lavoratori già esistenti.
Non voglio dover cambiare nessuno dei lavoratori concreti esistenti per soddisfare i requisiti della nuova classe WorkerB.
Ho pensato che forse un pattern Decorator sarebbe stato utile qui, ma non ho visto nessun decoratore decorare un oggetto con lo stesso metodo ma diversi parametri prima ...
Situazione nel codice:
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";
}
}