访问者模式,是行为型设计模式之一。访问者模式封装一些作用于某种数据结构各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素新的操作。访问者模式主要将数据操作和数据结构分离,解决数据结构和操作耦合性的问题。
访问者模式的基本工作原理是:在被访问的类里面加一个对外提供接待访问者的接口。
类图:
访问者模式的角色和职责:
(1)Visitor:接口或者抽象类,它定义了对每一个元素(Element)访问的行为,它的参数就是可以访问的元素,它的方法数理论上来讲与元素个数是一样的,因此,访问者模式要求元素的类族要稳定,如果经常添加、移除元素类,必然会导致频繁地修改Visitor接口,如果这样则不适合使用访问者模式。
(2)ConcreteVisitor:具体访问者,它需要给出对每一个元素类访问时所产生的具体行为。
(3)Element:元素接口或者抽象类,它定义了一个接受访问者的方法(Accept),其意义是指每一个元素都要可以被访问者访问。
(4)ConcreteElement:具体的元素类,它提供接受访问方法的具体实现,而这个具体的实现,通常情况下是使用访问者提供的访问该元素类的方法。
(5)ObjectStructure:对象结构是一个抽象表述,它内部管理了元素集合,并且可以迭代这些元素供访问者访问。
访问者
public abstract class Visitor {
public abstract void visitElement1(Element1 element1);
public abstract void visitElement2(Element2 element2);
}
具体访问者
public class Visitor1 extends Visitor {
@Override
public void visitElement1(Element1 element1) {
System.out.println("访问元素1");
}
@Override
public void visitElement2(Element2 element2) {
System.out.println("访问元素2");
}
}
元素类
public abstract class Element {
abstract void accept(Visitor action);
}
具体元素类
public class Element1 extends Element {
@Override
void accept(Visitor visitor) {
visitor.visitElement1(this);
}
}
public class Element2 extends Element {
@Override
void accept(Visitor visitor) {
visitor.visitElement2(this);
}
}
数据结构类
public class ObjectStruct {
private List<Element> elementList=new LinkedList<>();
public void add(Element p){
elementList.add(p);
}
public void delete(Element p){
elementList.remove(p);
}
public void display(Visitor visitor){
for(Element e:elementList){
e.accept(visitor);
}
}
}
客户端调用
public class Client {
public static void main(String[] args) {
ObjectStruct objectStruct=new ObjectStruct();
objectStruct.add(new Element1());
objectStruct.add(new Element2());
Visitor visitor=new Visitor1();
objectStruct.display(visitor);
}
}