您的位置:首页 > 其它

设计模式学习笔记(二十)—Visitor访问者模式

2008-09-24 14:39 323 查看
转贴自 http://www.blogjava.net/flustar/archive/2007/12/15/visitor.html

Visitor模式定义:

表示一个作用于某对象结构中各元素的操作。它可以使你不修改各元素类的前提下定义作用于这些元素的新操作,也就是动态的增加新的方法。

Visitor模式结构图:



Visitor模式中主要角色:

1) 访问者角色(Visitor):为该对象结构(ObjectStructure)中的具体元素提供一个访问操作接口。该操作接口的名字和参数标识了要访问的具体元素角色。这样访问者就可以通过该元素角色的特定接口直接访问它。

2) 具体访问者角色(ConcreteVisitor):实现Vistor接口的操作。

3)元素角色(Element):该接口定义一个accept操作接受具体的访问者。

4) 具体元素角色(ConcreteElement):实现Element的accept操作。

5) 对象结构角色(ObjectStructure):这是使用访问者模式必备的角色。它要具备以下特征:能枚举它的元素;可以提供一个高层的接口以允许该访问者访问它的元素;可以是一个复合(组合模式)或是一个集合,如一个列表或一个无序集合。

Visitor模式的一个例子

由于本人阅历不足,实在想不出好的例子,这个例子基本是按结构图所写,不过已经加上了注释。

import java.util.ArrayList;

import java.util.Collection;

interface Visitor{

public void visitElementA(ConcreteElementA elementA);//针对具体元素A的新方法

public void visitElementB(ConcreteElementB elementB);//针对具体元素B的新方法

}

interface Element{

public void accept(Visitor visitor);

}

class ConcreteVisitor implements Visitor{//具体的访问者

public void visitElementA(ConcreteElementA elementA) {

System.out.println(elementA.getName()+" visited by ConcreteVisitor ");

}

public void visitElementB(ConcreteElementB elementB) {

System.out.println(elementB.getName()+" visited by ConcreteVisitor ");

}

}

class ConcreteElementA implements Element{//具体元素A

private String name;

public ConcreteElementA(String name){

this.name=name;

}

public void accept(Visitor visitor) {//接受访问者调用它针对该元素的新方法

visitor.visitElementA(this);

}

public String getName() {

return name;

}

}

class ConcreteElementB implements Element{//具体元素B

private String name;

public ConcreteElementB(String name){

this.name=name;

}

public String getName() {

return name;

}

public void accept(Visitor visitor) {//接受访问者调用它针对该元素的新方法

visitor.visitElementB(this);

}

}

class ObjectStructure{//对象结构即元素的集合

private Collection<Element> collection=new ArrayList<Element>();

public void attach(Element element){

collection.add(element);

}

public void detach(Element element){

collection.remove(element);

}

public void accept(Visitor visitor )

{

for(Element element:collection){

element.accept(visitor);

}

}

}

public class Client {

public static void main(String args[]){

Element elementA=new ConcreteElementA("ElementA");

Element elementB=new ConcreteElementB("ElementB");

Visitor visitor=new ConcreteVisitor();

ObjectStructure os=new ObjectStructure();

os.attach(elementA);

os.attach(elementB);

os.accept(visitor);

}

}

Visitor模式优缺点:

1) 优点:不用修改具体的元素类,就可以增加新的操作。主要是通过元素类的accept方法来接受一个visitor对象来实现的。

2) 缺点:不易频繁增加元素类,没增加一个元素类,就要在Visitor接口中写一个针对该元素的方法,而且还要修改Visitor的子类。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: