Trong Wikipedia sample và trong sách GoF, việc sử dụng mẫu Khách truy cập được bắt đầu bằng cách gọi phương thức accept
trên một số người chấp nhận. Nhưng tại sao nó theo cách này? Tại sao chúng ta không thể bắt đầu gọi phương thức visit
với người chấp nhận mong muốn làm đối số? Chúng tôi vẫn có thể làm cho hành vi của khách truy cập phụ thuộc vào 2 loại - khách truy cập và người chấp nhận (công văn kép) - và chúng tôi có thể loại bỏ cuộc gọi dư thừa (giống như tôi).Tại sao chúng ta bắt đầu Khách truy cập bằng cách gọi cho Acceptor.accept() và không phải là Visitor.visit()?
Dưới đây là mẫu mã để minh họa điều này:
public interface Visitor {
void visit(AcceptorA acceptor);
void visit(AcceptorB acceptor);
}
//
// Visitor which sings
//
class SingingVisitor implements Visitor {
public void visit(AcceptorA acceptor) {
System.out.println("sing A");
}
public void visit(AcceptorB acceptor) {
System.out.println("sing B");
}
}
//
// Visitor which talks
//
class TalkingVisitor implements Visitor {
public void visit(AcceptorA acceptor) {
System.out.println("talk A");
}
public void visit(AcceptorB acceptor) {
System.out.println("talk B");
}
}
//
// Acceptor subclasses
//
class AcceptorA implements BaseAcceptor {
}
class AcceptorB implements BaseAcceptor {
}
//
// Launcher class
//
class VisitorMain {
public static void main(String[] args) {
Visitor v = new TalkingVisitor();
AcceptorA a = new AcceptorA();
AcceptorB b = new AcceptorB();
v.visit(a);
v.visit(b);
v = new SingingVisitor();
v.visit(a);
v.visit(b);
}
}
Nó chỉ là một ví dụ - không ai nói rằng nó phải được thực hiện theo cách này. –
@DaveNewton Tôi đã hỏi câu hỏi này chính xác để tìm hiểu xem liệu tôi có nhìn thấy một số lợi thế của phương pháp tiếp cận GoF hay chỉ là một quy ước. –