Tôi hơi không thân thiện với mẫu Khách truy cập, nhưng tôi có một nhiệm vụ cần thực hiện Khách truy cập (nếu tôi muốn tránh kiểm tra "instanceof").Cách sử dụng mẫu Khách truy cập để thay thế "instanceof"
Tôi có một lớp là trình bao bọc cho một số phần tử gwt: Nhãn, Bảng điều khiển, Tiện ích con (có thể là hộp kiểm, hộp danh sách, hộp văn bản, v.v.). Tôi sử dụng một mảng như một bộ sưu tập giống như các phần của giao diện người dùng. Ví dụ. Nhãn + hộp kiểm, nhãn + hộp văn bản; Nhãn + nút, vv ..
Một số thành phần được tạo theo cách khác (một phần của một lớp khác bắt nguồn từ, ví dụ như Panel). Vì vậy, kết quả là tôi có hai nhà xây dựng giống nhau, nhưng ở một nơi quá tải phương pháp được sử dụng. Tôi có thể hợp nhất các hàm tạo này và kiểm tra phần tử bằng cách sử dụng "instanceof" bên trong phương thức được đề cập. Nhưng tôi không thích giải pháp này và muốn thay thế nó bằng cách sử dụng mẫu Visitor. Để nói sự thật, tôi không biết làm thế nào để làm điều đó và hy vọng bạn giúp đỡ.
Dưới đây là một ví dụ về những gì tôi có:
public class MyWidgets {
private String stringLabel;
private Widget widget;
private Panel panel;
public MyWidgets(String stringLabel, Widget widget) {
this.stringLabel = stringLabel;
this.widget = widget;
initPanel(stringLabel, widget);
}
public MyWidgets(ConstructedClass cs, Widget widget) {
this.widget = widget;
initPanel(cs, widget);
}
private initPanel(String label, Widget widget) {
panel = SomeStaticUtilityClass.initPanel(new Label(label), widget);
}
private initPanel(ConstructedClass cs, Widget widget) {
panel = SomeStaticUtilityClass(cs, widget);
}
}
Something như thế này (tôi đã cố gắng để làm cho nó tối đa trừu tượng, trong thực tế nó là khó khăn hơn).
Vì vậy, tôi có một giải pháp sử dụng "instanceof":
private initPanel(Object object, Widget widget) {
if(object instanceof String) {
panel = SomeStaticUtilityClass.initPanel(new Label(label), widget);
}
if(object instanceof ConstructedClass) {
panel = SomeStaticUtilityClass.initPanelFromObject(cs, widget);
}
}
Tôi muốn được cứu khỏi "instanceof" và để lại chỉ là một nhà xây dựng và thậm chí, nếu có thể, một phương pháp init mà không phiên bản quá tải của nó . Cảm ơn bạn đã đề xuất, trợ giúp.
Tái bút> Tôi nhắc lại, rằng lớp trên là bịa đặt, và trông giống như một số hiểu lầm đặc biệt là với String này nhãn :)
Hmm .. có vẻ hơi lạ với dòng sau: "panel = SomeStaticUtilityClass (cs, widget);". Là SomeStaticUtilityClass một lớp học hoặc một phương pháp? :) – Javaguru
Tôi đã chỉnh sửa ví dụ – Dragon