访问者模式是封装一些施加于某种数据结构元素之上的操作,一旦这些操作需要修改,接受这个操作的数据结构则可以保持不变
访问者模式的定义 封装一些用于某种数据结构中的各元素的操作,他可以在不改变数据结构的前提下定义这些元素的新操作。
访问者模式的参与者:
抽象元素角色
public interface Element {
public void doSomething();
//声明一个接受操作,接受一个访问者对象
public void accept(Visitor v);
}
具体元素角色
public class ConcreteElement1 implements Element {
@Override
public void doSomething() {
System.out.println("与模范1坐在一起聊天");
}
// 实现抽象元素中的接受操作
@Override
public void accept(Visitor v) {
v.visit(this);
}
}
public class ConcreteElement2 implements Element {
@Override
public void doSomething() {
System.out.println("与模范2吃家常饭");
}
@Override
public void accept(Visitor v) {
v.visit(this);
}
}
抽象访问者角色
public interface Visitor {
// 声明访问者要访问那些元素
public void visit(ConcreteElement1 e1);
public void visit(ConcreteElement2 e2);
}
具体访问者角色
public class ConcreteVisitor1 implements Visitor {
// 实现访问方法的具体过程
@Override
public void visit(ConcreteElement1 e1) {
System.out.println("1号领导嘘寒问暖,然后握手");
System.out.print("1号领导");
e1.doSomething();
}
@Override
public void visit(ConcreteElement2 e2) {
System.out.println("1号领导视察生活条件,然后握手");
System.out.print("1号领导");
e2.doSomething();
}
}
public class ConcreteVisitor2 implements Visitor {
@Override
public void visit(ConcreteElement1 e1) {
System.out.println("2号领导表示亲切慰问");
System.out.print("2号领导");
e1.doSomething();
}
@Override
public void visit(ConcreteElement2 e2) {
System.out.println("2号领导表示亲切关怀");
System.out.print("2号领导");
e2.doSomething();
}
}
结构对象角色
public class ObjectStructure {
private Vector<Element> elements;
public ObjectStructure(){
this.elements = new Vector<>();
}
public void add(Element e) {
elements.add(e);
}
public void action(Visitor vi){
for (Element e: elements) {
e.accept(vi);
}
}
}
访问者模式的优点
访问者模式的缺点
访问者模式的使用场景