概念:封装一些作用于某种数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新操作。
- 抽象访问者:声明一个或多个访问操作,定义访问者可以访问哪些元素。
- 具体访问者:实现抽象访问者的所有操作。
- 抽象元素:声明一个接受操作,接受一个访问者对象。
- 具体元素:实现抽象元素中的接受操作。实际上就是在该方法中去调用对应的visit方法。
- 结构对象:遍历结构中的所有元素,并对元素进行访问操作。
public interface Visitor {
void visit(ElementA elementA);
void visit(ElementB elementB);
}
public class ConcreteVisitor implements Visitor {
@Override
public void visit(ElementA elementA) {
System.out.println("访问 ElementA: " + elementA);
// 针对ElementA的具体操作
}
@Override
public void visit(ElementB elementB) {
System.out.println("访问 ElementB: " + elementB);
// 针对ElementB的具体操作
}
}
public interface Element {
void accept(Visitor visitor);
}
public class ElementA implements Element {
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
public class ElementB implements Element {
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
public class ObjectStructure {
private List<Element> elements = new ArrayList<>();
public void attach(Element element) {
elements.add(element);
}
public void detach(Element element) {
elements.remove(element);
}
public void accept(Visitor visitor) {
for (Element element : elements) {
element.accept(visitor);
}
}
}
public class Demo {
public static void main(String[] args) {
ObjectStructure objectStructure = new ObjectStructure();
objectStructure.attach(new ElementA());
objectStructure.attach(new ElementB());
objectStructure.attach(new ElementA());
objectStructure.attach(new ElementA());
objectStructure.attach(new ElementB());
objectStructure.attach(new ElementB());
Visitor visitor = new ConcreteVisitor();
// 访问所有的元素
objectStructure.accept(visitor);
}
}
如果大家需要视频版本的讲解,欢迎大家关注我的B站:
【天哥不爱学习的个人空间-哔哩哔哩】 https://b23.tv/HxwqjXl