Visitor访问者设计模式是在不修改已有程序结构的前提下,通过添加额外的“访问者”来完成对已有代码功能的提升。
Visitor访问者设计模式的角色:
(1) 访问者角色(Visitor):声明一个访问接口。接口的名称和方法的参数标识了向访问者发送请求的元素角色。这样访问者就可以通过该元素角色的特定接口直接访问它。 (2) 具体访问者角色(Concrete Visitor):实现访问者角色(Visitor)接口(3)元素角色(Element):定义一个Accept操作,它以一个访问者为参数。
(4) 具体元素角色(Concrete Element):实现元素角色(Element)接口。 (5) 对象结构角色(Object Structure):具体元素的集合,提供一个高层的接口允许访问者角色访问它的元素。Visitor访问者设计模式结构如下:
Visitor访问者设计模式例子代码如下:
//抽象元素interface IElement{ public void accept(IVisitor visitor);}//具体元素class ElementA implements IElement{ public void accept(IVisitor visitor){ visitor.visit(this); } public void operationA(){ System.out.println(“ElementA do operationA()……”); }}class ElementB implements IElement{ public void accept(IVisitor visitor){ visitor.visit(this); } public void operationB(){ System.out.println(“ElementB do operationB()……”); }}class ElementC implements IElement{ public void accept(IVisitor visitor){ visitor.visit(this); } public void operationC(){ System.out.println(“ElementC do operationC()……”); }}//抽象访问者interface IVisitor{ public void visit(ElementA element); public void visit(ElementB element); public void visit(ElementC element);}//具体访问者class MyVisitor implements IVisitor{ public void visit(ElementA element){ element.operationA(); } public void visit(ElementB element){ element.operationB(); } public void visit(ElementC element){ element.operationC(); }} Public class VisitorDemo{ public static void main(String[] args){ IElement[] list = {new ElementA(), new ElementB(), new ElementC()}; IVisitor visitor = new MyVisitor(); for(int i = 0; i < list.length; i++){ list[i].accept(visitor); } }}
Visitor访问者设计模式有以下两个特点:
(1).对元素的访问不是访问者主动发起的,而是通过元素接收访问者来访问自己。
(2).对元素的操作不是元素自己主动调用,而是通过访问者的访问方法来操作元素。
JDK中访问者模式的应用:
•javax.lang.model.element.Element和javax.lang.model.element.ElementVisitor
•javax.lang.model.type.TypeMirror和javax.lang.model.type.TypeVisitor
•javax.lang.model.element.AnnotationValue和javax.lang.model.element.AnnotationValueVisitor