Tôi không chắc mẫu thiết kế nào có thể giúp tôi giải quyết vấn đề này.
Tôi có một lớp, 'Điều phối viên', xác định lớp Công nhân nào sẽ được sử dụng - mà không cần phải biết về tất cả các loại Công nhân khác nhau - nó chỉ gọi một WorkerFactory và hoạt động trên giao diện IWorker chung.
Sau đó, nó thiết lập Công nhân thích hợp để làm việc và trả về kết quả của phương thức 'DoWork'.
Điều này đã ổn ... cho đến bây giờ; chúng tôi có một yêu cầu mới đối với một lớp Worker mới, "WorkerB", yêu cầu một lượng thông tin bổ sung, tức là một tham số đầu vào bổ sung, để nó thực hiện công việc của nó.
Giống như chúng ta cần một phương thức DoWork quá tải với tham số đầu vào bổ sung ... nhưng sau đó tất cả các Công nhân hiện tại sẽ phải thực hiện phương thức đó - điều này có vẻ sai vì những Công nhân đó thực sự không cần phương thức đó.
Làm cách nào tôi có thể cấu trúc lại điều này để giữ cho Điều phối viên không biết Công nhân nào đang được sử dụng và vẫn cho phép mỗi Công nhân nhận được thông tin cần thiết để thực hiện công việc của mình nhưng không có Công nhân nào làm những việc không cần thiết?
Có rất nhiều Công nhân hiện có.
Tôi không muốn phải thay đổi bất kỳ Công nhân cụ thể nào hiện có để đáp ứng các yêu cầu của lớp WorkerB mới.
Tôi nghĩ có lẽ một mẫu Trang trí sẽ tốt ở đây nhưng tôi chưa thấy Trang trí nào trang trí một đối tượng với cùng một phương thức nhưng các tham số khác nhau trước đó ...
Tình huống trong mã:
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
đã phải thay đổi để phù hợp với tham số bổ sung đó trong GetWorkerResult
chức năng của nó - điều đó có nghĩa là Nguyên tắc mở-đóng-mở của RẮN bị vi phạm. Kết quả là, tất cả các cuộc gọi mã Coordinator.GetWorkerResult
cũng phải được thay đổi. Vì vậy, hãy nhìn vào nơi bạn gọi hàm đó: làm thế nào để bạn quyết định IWorker nào sẽ yêu cầu? Điều đó có thể dẫn đến một giải pháp tốt hơn.
IWorker
giao diện được liệt kê phiên bản cũ, hoặc đó là một phiên bản mới với một tham số được thêm vào?