当您的数据不会像您的行为一样快速变化时,访问者是一种有价值的设计。一个典型的例子是解析树:
- 您的类层次结构(您的数据)被冻结
- 你的行为变化太大,你不想破坏你的类添加另一个虚拟方法
我不认为访问者在这里是一个有价值的解决方案,因为每次添加 AuthResult 的子类时,都会破坏访问者。
访问者是关于双重调度的交易封装。
您可以尝试类似的方法:
interface Handler {
void onUsernameNotFound();
void onWrongPassword();
void authOk();
}
interface Authenticator {
void authenticate(String username, String password, Handler handler);
}
class SimpleAuthenticator implements Authetnciator {
void authenticate(String username, String password, Handler handler) {
if (username.equals("dfa")) {
if (password.equals("I'm1337")) {
handler.authOk();
} else {
handler.onWrongPassword();
}
} else {
handler.onUsernameNotFound();
}
}
}
一些处理程序策略:
class FatalHandler implements Handler {
void onUsernameNotFound() {
throw new AuthError("auth failed");
}
void onWrongPassword() {
throw new AuthError("auth failed");
}
void authOk() {
/* do something */
}
}
和:
class DebugHandler implements Handler {
void onUsernameNotFound() {
System.out.println("wrong username");
}
void onWrongPassword() {
System.out.println("wrong password");
}
void authOk() {
System.out.println("ok");
}
}
现在您可以在您Handler
的 s 中封装错误处理和操作,这比 Visitor 的代码要少得多,因为您在这里并不需要双重调度。