设计模式学习笔记(二十)—Visitor访问者模式
来源:互联网 发布:uiautomator源码 编辑:程序博客网 时间:2024/04/27 21:43
转贴自 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的子类。
- 设计模式学习笔记(二十)—Visitor访问者模式
- 设计模式之二十------Visitor(访问者)
- 设计模式学习笔记二十四(Visitor访问者模式)
- 设计模式学习笔记--访问者(Visitor)模式
- 设计模式学习笔记——访问者(Visitor)模式
- 设计模式学习笔记(二十五)——Visitor访问者
- 设计模式笔记-Visitor访问者模式
- Visitor(访问者)设计模式
- 设计模式学习—访问者模式(Visitor Design Pattern)
- 设计模式——访问者模式(Visitor)
- 设计模式—Visitor访问者模式
- 设计模式 — 访问者模式(Visitor Method)
- JAVA设计模式—访问者模式(Visitor)
- visitor-acceptor访问者设计模式笔记
- 设计模式(c++)笔记之二十(Visitor模式)
- [设计模式笔记]三. 行为型模式--25. Visitor模式(访问者)对象行为型模式(二)
- 设计模式--访问者模式(Visitor)
- [设计模式]visitor访问者模式
- 疯娘
- TCP连接被意外重置的原因
- 放大镜
- 构架、框架、设计模式之间的关系简述
- MFC文档/视图架构之相互关系解析
- 设计模式学习笔记(二十)—Visitor访问者模式
- 设计模式学习笔记(十九)—Chain of Responsibility职责链模式
- 设计模式学习笔记(十八)—Mediator中介者模式
- OSI Certified标志与纲要
- Ajax 的 asp.net CS调用JS方法,嘿嘿,自己用
- BinaryStar JS组件 V6.1.1
- 一种基于Haar小波变换的彩色图像人脸检测方法
- DataSet和DataReader的区别
- 获得网卡MAC地址