Как и предполагалось, шаблон посетителя является хорошей идеей, поскольку он поддерживает модульность кода. Это связано с тем, что код для каждого теста хранится в своем собственном классе и методе, что помогает предотвратить чрезмерную длину и сложность методов.
Теперь это также означает, что вам не нужно проверять, является ли Объект прямоугольником или нет, как это делается с помощью техники, известной как двойная диспетчеризация. При этом GameObject знает, какой это класс класса, и поэтому вызывает соответствующий метод разрешения для посетителя.
Это также помогает в сопровождении, как если бы вам нужно было обращаться с другим подклассом GameObject специально, тогда вы сначала измените интерфейс ResolveVisitor, а затем начнете изменять конкретные реализации посетителей. Если вы случайно забудете об этом, компилятор не позволит вам скомпилировать код и указать на проблему.
Вот подробный пример шаблона посетителя:
void resolve(GameObject obj) {
if (first test) {
obj.accept(new FirstTestVisitor());
} else if (second test) {
obj.accept(new SecondTestVistor());
} else {
obj.accept(new DefaultVisitor());
}
}
interface GameObject {
public void accept(ResolveVisitor visitor);
}
interface ResolveVisitor {
public void resolve(Rectangle rect);
public void resolve(GameObject obj); // default case
}
class Rectangle implements GameObject {
public void accept(Visitor visitor) {
visitor.resolve(this);
// Rectangle and its subclasses will call resolve(Rectangle)
// whereas all other GameObjects will call resolve(GameObject)
// though other GameObjects will need their own accept method
}
}
class FirstTestVisitor implements ResolveVisitor {
public void accept(Rectangle rect) {
// logic for first test and if rect goes here
}
public void accept(GameObject obj) {
// logic for first test and not rect goes here
}
}