一、UML类图
![在这里插入图片描述](https://img-blog.csdnimg.cn/d9d2d362ff014b139a2bb03e3e32a2be.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5rua562S5rSX6KGj5py6eGlu,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)
二、代码示例
public class Client {
public static void main(String[] args) {
ObjectStructure objectStructure = new ObjectStructure();
objectStructure.add(new ConcreteElementA());
objectStructure.add(new ConcreteElementB());
Visitor visitor = new ConcreteVisitor();
objectStructure.accept(visitor);
}
}
public interface Visitor {
void visit(ConcreteElementA concreteElementA);
void visit(ConcreteElementB concreteElementB);
}
public class ConcreteVisitor implements Visitor{
@Override
public void visit(ConcreteElementA concreteElementA) {
concreteElementA.operatorA();
}
@Override
public void visit(ConcreteElementB concreteElementB) {
concreteElementB.operatorB();
}
}
public interface Element {
void accept(Visitor visitor);
}
public class ConcreteElementA implements Element{
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
public void operatorA() { }
}
public class ConcreteElementB implements Element{
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
public void operatorB() { }
}
public class ObjectStructure {
List<Element> elements = new ArrayList<>();
public void add(Element element) {
elements.add(element);
}
public void remove(Element element) {
elements.remove(element);
}
public void accept(Visitor visitor) {
for (Element element : elements) {
element.accept(visitor);
}
}
}
三、角色介绍
- Client(客户端):
客户端角色,程序调用者。 - Visitor(访问者):
该角色负责对数据结构中每个具体的元素声明一个用于访问的方法。 - ConcreteVisitor(具体的访问者):
该角色负责实现Visitor角色所定义的接口。 - Element(元素):
该角色表示Visitor角色的访问对象,声明了接受访问者的accept方法,该方法接收到的参数是Visitor角色。 - ConcreteElement(具体的元素):
该角色负责实现Element角色所定义的接口。 - ObjectStructure(对象结构):
该角色负责处理Element角色的集合,为每个Element角色定义了处理方法。