访问者模式:将对象的变化(共享)和不变部分(不共享)进行分离,将变化部分交由具体的访问者执行,访问者可以根据具体的类进行动作
优点:封装不变部分,扩展变化部分,一般是在循环抽象对象时候,由访问者来对不同的具体对象进行操作
标准类图:
抽象元素:
public interface Element {
public void accept(Visitor visitor);
}
具体元素:
public class ConcreteElement1 implements Element{
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
public class ConcreteElement2 implements Element{
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
抽象访问者:
public interface Visitor {
void visit(ConcreteElement1 ce1);
void visit(ConcreteElement2 ce2);
}
具体访问者:
public class ConcreteVisitor implements Visitor{
@Override
public void visit(ConcreteElement1 ce1) {
System.out.println("处理 ce1");
}
@Override
public void visit(ConcreteElement2 ce2) {
System.out.println("处理 ce2");
}
}
场景类:
public class Client {
public static void main(String[] args) {
List<Element> elements = new ArrayList<>();
Element e1 = new ConcreteElement1();
Element e2 = new ConcreteElement1();
Element e3 = new ConcreteElement2();
Element e4 = new ConcreteElement2();
elements.add(e1);
elements.add(e2);
elements.add(e3);
elements.add(e4);
Visitor visitor = new ConcreteVisitor();
for (Element element : elements) {
element.accept(visitor);
}
}
}