您的位置:首页 > 其它

设计模式22——Visitor设计模式

2014-09-10 15:49 183 查看
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();

}

publi 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: