一、简介
访问者模式(Visitor):为其他对象提供一种代理以控制这个对象的访问。可以在目标对象实现的基础上,增强额外的功能操作,扩展目标对象的功能。
封装一些作用于某种数据结构的各元素的操作,可以在不改变数据结构的前提下定义作用于这些元素的新的操作。
二、结构图
三、代码实现
1.Visit
public interface Visitor {
void visitElement(Element element);
}
2.ConcreteVisitorA、ConcreteVisitorB
public class ConcreteVisitorA implements Visitor{
@Override
public void visitElement(Element element) {
System.out.println("visit A .....");
}
}
public class ConcreteVisitorB implements Visitor{
@Override
public void visitElement(Element element) {
System.out.println("visit B .....");
}
}
3.Element
public interface Element {
void accept(Visitor visitor);
}
4.ConcreteElementA、ConcreteElementB
public class ConcreteElementA implements Element{
@Override
public void accept(Visitor visitor) {
visitor.visitElement(this);
operationA();
}
private void operationA() {
System.out.println("A operation method....");
}
}
public class ConcreteElementB implements Element{
@Override
public void accept(Visitor visitor) {
visitor.visitElement(this);
operationB();
}
private void operationB() {
System.out.println("B operation method....");
}
}
5.ObjectStructure
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);
}
}
}
6.Client
public class Client {
public static void main(String[] args) {
ObjectStructure objectStructure = new ObjectStructure();
objectStructure.attach(new ConcreteElementA());
objectStructure.attach(new ConcreteElementB());
Visitor visitorA = new ConcreteVisitorA();
Visitor visitorB = new ConcreteVisitorB();
objectStructure.accept(visitorA);
objectStructure.accept(visitorB);
}
}
四、总结
- 主要将数据结构于数据操作分离,解决数据结构和操作耦合性问题。
- 优点是增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。
- 缺点是增加新的数据结构变得困难。