Bối cảnh
Tôi đã sử dụng với một hệ thống phân cấp các đối tượng (một cây biểu thức) một mẫu khách truy cập "giả" (giả, như trong nó không sử dụng công văn kép):
public interface MyInterface
{
void Accept(SomeClass operationClass);
}
public class MyImpl : MyInterface
{
public void Accept(SomeClass operationClass)
{
operationClass.DoSomething();
operationClass.DoSomethingElse();
// ... and so on ...
}
}
Thiết kế này, tuy nhiên có thể nghi ngờ, khá thoải mái vì số lần triển khai MyInterface là đáng kể (~ 50 trở lên) và tôi không cần thêm các hoạt động bổ sung.
Mỗi triển khai là duy nhất (đó là một biểu thức hoặc toán tử khác nhau) và một số là các vật liệu tổng hợp (nghĩa là các nút toán tử sẽ chứa các nút toán tử / lá khác).
Traversal hiện được thực hiện bằng cách gọi thao tác Chấp nhận trên nút gốc của cây, lần lượt gọi Chấp nhận trên mỗi nút con của nó, lần lượt ... và cứ thế ...
Nhưng đã đến lúc tôi cần thêm một thao tác mới , chẳng hạn như in ấn đẹp:
public class MyImpl : MyInterface
{
// Property does not come from MyInterface
public string SomeProperty { get; set; }
public void Accept(SomeClass operationClass)
{
operationClass.DoSomething();
operationClass.DoSomethingElse();
// ... and so on ...
}
public void Accept(SomePrettyPrinter printer)
{
printer.PrettyPrint(this.SomeProperty);
}
}
Về cơ bản tôi thấy hai tùy chọn:
- Giữ nguyên thiết kế, thêm một phương thức mới cho hoạt động của tôi vào mỗi lớp dẫn xuất, với chi phí bảo trì (không phải là một tùy chọn, IMHO)
- Sử dụng mẫu Khách truy cập "thật", với chi phí có thể mở rộng (không phải là một tùy chọn, như tôi dự kiến sẽ có nhiều triển khai hơn trên đường đi ...), với khoảng hơn 50 quá tải của phương thức Truy cập, mỗi phương thức phù hợp với một triển khai cụ thể ?
Câu hỏi
Bạn có muốn giới thiệu và sử dụng mẫu Khách truy cập không? Có mô hình nào khác có thể giúp giải quyết vấn đề này không?
MyInterface
.. tất cả các lớp đó có triển khai duy nhất DoSomething
và DoSomethingElse
không? Tôi không thấy nơi khách truy cập của bạn thực sự đi qua hệ thống phân cấp - nó trông giống như một facade
lúc này ..