Visitor访问者设计模式是在不修改已有程序结构的前提下,经过添加额外的“访问者”来完成对已有代码功能的提高。 java
Visitor访问者设计模式的角色:
(1) 访问者角色(Visitor):声明一个访问接口。接口的名称和方法的参数标识了向访问者发送请求的元素角色。这样访问者就能够经过该元素角色的特定接口直接访问它。
(2) 具体访问者角色(Concrete Visitor):实现访问者角色(Visitor)接口 设计模式
(3)元素角色(Element):定义一个Accept操做,它以一个访问者为参数。
(4) 具体元素角色(Concrete Element):实现元素角色(Element)接口。
(5) 对象结构角色(Object Structure):具体元素的集合,提供一个高层的接口容许访问者角色访问它的元素。 this
Visitor访问者设计模式结构以下: spa
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访问者设计模式有如下两个特色: code
(1).对元素的访问不是访问者主动发起的,而是经过元素接收访问者来访问本身。 对象
(2).对元素的操做不是元素本身主动调用,而是经过访问者的访问方法来操做元素。 接口
JDK中访问者模式的应用: element