简介
访问者模式,是行为型设计模式之一。访问者模式是一种将数据操作与数据结构分离的设计模式,它可以算是 23种设计模式中最复杂的一个,但它的使用频率并不是很高。
访问者模式的基本想法是,软件系统中拥有一个由许多对象构成的、比较稳定的对象结构,这些对象的类都拥有一个 accept 方法用来接受访问者对象的访问。访问者是一个接口,它拥有一个 visit 方法,这个方法对访问到的对象结构中不同类型的元素做出不同的处理。在对象结构的一次访问过程中,我们遍历整个对象结构,对每一个元素都实施 accept 方法,在每一个元素的 accept 方法中会调用访问者的 visit 方法,从而使访问者得以处理对象结构的每一个元素,我们可以针对对象结构设计不同的访问者类来完成不同的操作,达到区别对待的效果。
访问者模式结构图:
角色
1) 访问者角色(Visitor):为该对象结构中具体元素角色声明一个访问操作接口。该操作接口的名字和参数标识了发送访问请求给具体访问者的具体元素角色。这样访问者就可以通过该元素角色的特定接口直接访问它。
2) 具体访问者角色(Concrete Visitor):实现每个由访问者角色(Visitor)声明的操作。
3) 元素角色(Element):定义一个Accept操作,它以一个访问者为参数。
4) 具体元素角色(Concrete Element):实现由元素角色提供的Accept操作。
5) 对象结构角色(Object Structure):这是使用访问者模式必备的角色。它要具备以下特征:能枚举它的元素;可以提供一个高层的接口以允许该访问者访问它的元素;可以是一个复合(组合模式)或是一个集合,如一个列表或一个无序集合。
简单示例
1.创建访问者角色(Visitor)
public interface Visitor {
public void visit(NodeA nodeA);
public void visit(NodeB nodeB);
public void visit(NodeC nodeC);
public void visitCollection(Collection collection);
}
2.创建具体访问者角色(Concrete Visitor)
public class VisitorA implements Visitor {
@Override
public void visit(NodeA nodeA) {
System.out.println("Execute visitNodeA method!");
}
@Override
public void visit(NodeB nodeB) {
System.out.println("Execute visitNodeB method!");
}
@Override
public void visit(NodeC nodeC) {
System.out.println("Execute visitNodeC method!");
}
@Override
public void visitCollection(Collection collection) {
Iterator iterator = collection.iterator();
while (iterator.hasNext()) {
Object o = iterator.next();
if (o instanceof Visitable)
((Visitable) o).accept(this);
}
}
}
3.创建元素角色(Element)
public interface Visitable {
public void accept(Visitor visitor);
}
4.具体元素角色(Concrete Element)
public class NodeA implements Visitable {
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
public class NodeB implements Visitable {
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
public class NodeC implements Visitable {
@Override
public void accept(Visitor visitor) {
visitor.visit(this);
}
}
5.Client(Main验证)
public class VisitorMain {
public static void main(String[] args) {
NodeA nodeA = new NodeA();
NodeB nodeB = new NodeB();
NodeC nodeC = new NodeC();
VisitorA visitorA = new VisitorA();
visitorA.visit(nodeA);
visitorA.visit(nodeB);
visitorA.visit(nodeC);
List<Visitable> list = new ArrayList<Visitable>();
list.add(nodeA);
list.add(nodeB);
list.add(nodeC);
visitorA.visitCollection(list);
}
}