设计模式:visitor

拜访者模式(visitor)适用于对复杂结构体进行解析的场景。

所谓复杂结构体,是指包含多个子元素的对象,比如集合,树,图,或者组合对象……。结构体中的每个元素,包括结构体本身实现接口:

Element{

//element的信息属性,在此省略

//专门用于调用visitor的方法

void accept(visitor)

}

所谓解析,是指提取结构体中各个元素的相关信息,组合起来。解析器实现接口:

Visitor{

void accept(Element的具体子类);//因为不同的Element子类有不同的信息

}

对于client来说,按照如下模式调用:

visitor= new XXXVisitor;

Element e=从外界获得的实例;

e.accept( visitor )

visitor.getOutput();

-----------

为什么需要Visitor模式呢?

让我们考虑这样的情形,结构体是一个二叉树的结构体,如果不用visitor模式,那么Visitor的visit方法定义如下:

void visit( Element root){

if(root != null)

accept(root);

if(root.right!=null) visit(root.right);

if(root.left!=null) visit(root.left);

}

这样的话,有两个问题:

  1. Element的内部结构遍历的方法在visitor中实现,如果还有另外一个visitor要实现这个功能,它也需要实现遍历方法,这是一种重复的逻辑;
  2. 如果element的内部结构调整了,visitor1 和visitor2都必须改变。

-----------

所以visitor模式就是采用参观者和被参观对象的角色变换,实现了结构体和解析逻辑的解耦合。他适用于对同一个结构体有多种解析方法的情形。

时间: 2024-11-05 23:22:02

设计模式:visitor的相关文章

Java23种设计模式

设计模式并非类库,但类库中使用了设计模式 ● java.util.Iterator是用于遍历元素集合的接口,这里使用了Iterator模式 ● java.util.Observer是用于观察对象状态变化的接口,这里使用了Observer模式 ● 以下的方法中使用了Factory Method模式 java.util.Calender类的getInstance方法 java.secure.SecureRandom类的getInstance方法 java.text.NumberFormat类的get

《PHP设计模式大全》系列技术文章整理收藏

<PHP设计模式大全>系列技术文章整理收藏 1php设计模式介绍之值对象模式第1/5页http://www.lai18.com/content/375691.html 2php设计模式介绍之编程惯用法第1/3页http://www.lai18.com/content/375692.html 3介绍php设计模式中的工厂模式http://www.lai18.com/content/375622.html 4php设计模式 Command(命令模式)http://www.lai18.com/con

Java 设计模式实现 不错的引用

这段时间有兴趣重新温习一下设计模式在Java中的实现,碰巧看到一个不错的设计模式总结,这里引用一下作为参考. 创建型模式: JAVA设计模式-Singleton JAVA设计模式-Factory JAVA设计模式-Builder JAVA设计模式-Prototype 结构型模式: JAVA设计模式-Adapter JAVA设计模式-Bridge JAVA设计模式-Composite JAVA设计模式-Decorator JAVA设计模式-Facade JAVA设计模式-FlyWeight JAV

[php]php设计模式 (总结)

转载自[php]php设计模式 (总结) 传统的23种模式(没有区分简单工厂与抽象工厂) http://www.cnblogs.com/bluefrog/archive/2011/01/04/1925933.html php设计模式 Interpreter(解释器模式) http://www.cnblogs.com/bluefrog/archive/2011/01/04/1925932.html php设计模式 Factory(工厂模式) http://www.cnblogs.com/bluef

《PHP设计模式大全》系列分享专栏

<PHP设计模式大全>已整理成PDF文档,点击可直接下载至本地查阅https://www.webfalse.com/read/201739.html 文章 php设计模式介绍之编程惯用法第1/3页 php设计模式介绍之值对象模式第1/5页 介绍php设计模式中的工厂模式 php设计模式 Command(命令模式) php设计模式 Facade(外观模式) php设计模式 Template (模板模式) php设计模式 Proxy (代理模式) php设计模式 Observer(观察者模式) p

[转][osg]探究osg中的程序设计模式【目录】

作者:3wwang 原文接连:http://www.3wwang.cn/html/article_104.html 前序 探究osg中的程序设计模式---开篇 探究osg中的程序设计模式---创造性模式 探究osg中的程序设计模式---创造型模式---Factory(工厂)模式 探究osg中的程序设计模式---创造型模式---AbstractFactory(抽象工厂)模式 探究osg中的程序设计模式---创造型模式---Singleton(单例)模式 探究osg中的程序设计模式---创造型模式-

OSG:先导篇 访问器机制

一.简介 osg::NodeVisitor 类是设计模式 Visitor (观察者模式)的实现,osg::NodeVisitor 类继承自 osg::Reference 类 osg::NodeVisitor是一个虚基类,在程序中无法实例化 osg::NodeVisitor中主要有 apply():决定了遍历的方式,可以获得各个节点的属性,也可以修改节点属性 accept():关联需要访问的节点,并启动访问器进行遍历 在用户应用程序中,可以编写继承自osg::NodeVisitor的新类,再通过重

JAVA设计模式之 访问者模式【Visitor Pattern】

一.概述 访问者模式是一种较为复杂的行为型设计模式,它包含访问者和被访问元素两个主要组成部分,这些被访问的元素通常具有不同的类型,且不同的访问者可以对它们进行不同的访问操作.在使用访问者模式时,被访问元素通常不是单独存在的,它们存储在一个集合中,这个集合被称为"对象结构",访问者通过遍历对象结构实现对其中存储的元素的逐个操作.访问者模式是一种对象行为型模式. 二.适用场景 当有多种类型的访问者(或是操作者) 对一组被访问者对象集合(或是对象结构)进行操作(其中对象集合也包含多种类型对象

设计模式入门之访问者模式Visitor

Set集合的配置 数据表的创建:表关系一个员工拥有多个身份 create table EMPLOYEE ( id INT NOT NULL auto_increment, first_name VARCHAR(20) default NULL, last_name VARCHAR(20) default NULL, salary INT default NULL, PRIMARY KEY (id) ); create table CERTIFICATE ( id INT NOT NULL aut

C++设计模式实现--访问者(Visitor)模式

一. 访问者模式 定义:表示一个作用于某对象结构中的各元素的操作.它你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 结构如下: 二. 举例 假设有一项科学实验,是用来对比两种种子在不同环境下的生长情况. 两种种子,一种是普通的种子(Seed_A),一种是太空运回的种子(Seed_B). 生长环境,分别是在多雨环境下(Rain_Status),阳光环境下(Sun_Status)等等. 结构如下: 代码如下: [cpp] view plaincopy //状态 class Status