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的子类。
- 大小: 5.6 KB
分享到:
相关推荐
设计模式C++学习之访问者模式(Visitor)
访问者模式(Visitor) 用意:适用于数据结构相对未定的系统,把数据结构和作用于结构上的操作间的耦合解开。
C#面向对象设计模式纵横谈(24):(行为型模式) Visitor 访问者模式
C#面向对象设计模式 (行为型模式) Visitor 访问者模式 视频讲座下载
设计模式 -访问者(Visitor)模式详解和应用.pdf
Visitor(访问者模式)属于行为型模式。意图:表示一个作用于某对象结构中的各元素的操作。
表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
访问者模式(Visitor Pattern)是GoF提出的23种设计模式中的一种,属于行为模式。它表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。从定义可以看出,...
c++设计模式-行为型模式-访问者模式;qt工程;c++简单源码; 访问者(Visitor)模式的定义:将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新...
C#面向对象设计模式纵横谈(24):(行为型模式) Visitor 访问者模式.rar 李建忠主讲 上海祝成信息科技有限公司担任软件架构师,并讲授C#/.NET软件开发课程
面向对象 北工大 课设 使用多种设计模式,实现的求值引擎,包括表达式树的构建
主要介绍了iOS应用的设计模式开发中的Visitor访问者模式的实例,示例代码为传统的Objective-C,需要的朋友可以参考下
博文链接:https://notguru.iteye.com/blog/78260
访问者模式(Java代码实现),博文附件
章节介绍:1、爪哇语言结构性模式之变压器模式介绍 2、爪哇语言抽象工厂创立性模式介绍 3、工厂方法创立性模式介绍 4、单态创立性模式介绍 5、单态创立性模式介绍 6、观察者模式介绍7、责任链模式 8、设计模式之...
也许最开始出现这种模式,是因为另外的原因: 我有一堆数据放在一个库里头,不想让其它人拿着, 如果你要用数据干活,那你就把函数指针给我,我来替你使用这个数据。...然后人们就说,这是visitor模式。
创建模式: 设计模式之Factory 设计模式之Prototype(原型) 设计模式之Builder 设计模式之Singleton(单态) 结构模式: 设计模式之Facade(外观) 设计模式之Proxy(代理) 设计模式之Adapter(适配器) ...设计模式之Visitor
本文实例讲述了C#设计模式之Visitor访问者模式解决长隆欢乐世界问题。分享给大家供大家参考,具体如下: 一、理论定义 访问者模式 提供了 一组 集合 对象 统一的 访问接口,适合对 一个集合中的对象,进行逻辑操作,...
一、 访问者(Visitor)模式 192 二、 访问者模式的结构 193 三、 示意性源代码 194 四、 一个实际应用Visitor模式的例子 198 五、 在什么情况下应当使用访问者模式 202 六、 使用访问者模式的优点和缺点 203 设计...