Посетитель - это ценный дизайн, когда ваши данные не изменяются так же быстро, как ваше поведение . Типичный пример с деревом разбора:
- ваша иерархия классов (ваши данные) заморожена
- ваше поведение меняется слишком сильно, вы не хотите прерывать занятия, добавляя еще один виртуальный метод
Я не думаю, что Посетитель является здесь ценным решением, поскольку каждый раз, когда вы добавляете подкласс 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, так как вам не нужна двойная отправка здесь.