设计模式之二十四:訪问者模式(Visitor)
訪问者模式:
定义了一个作用于一个类的一些操作,訪问者模式同意在不改变类的前提下添加一些操作。
Represent an operation to be performed on the elements of an object structure. Visitor lets you define a new operation without changing the classes of the elements on which it operates.
UML类图:
主要包括:
- Visitor:声明了一个全部訪问器都须要实现的接口。
- ConcreteVisitor:实现每一个訪问器都须要实现的接口,每一个操作知识实现了和特定类相关的一些算法。
- Element:定义了一个须要接受Visitor作为參数的accept方法。
- ConcreteElement:实现了accept方法的类。
- ObjectStructure:包括全部的Element对象,提供了一个高层次的接口同意visitor訪问elements元素。
这个模式主要使用在须要给类加入一个功能,可是不希望在类中加入时使用。C++代码实现:
#include <iostream>
#include <list>
using namespace std;
class ConcreteElementA;
class ConcreteElementB;
class Visitor
{
public:
virtual void visitConcreteElementA(ConcreteElementA * c)=0;
virtual void visitConcreteElementB(ConcreteElementB *)=0;
};
class ConcreteVisitor1:public Visitor
{
public:
virtual void visitConcreteElementA(ConcreteElementA * c)
{
cout<<"ConcreteVisit1 operate on ConcreteElementA"<<endl;
}
virtual void visitConcreteElementB(ConcreteElementB *)
{
cout<<"ConcreteVisitor1 operate on ConcreteElementB"<<endl;
}
};
class ConcreteVisitor2:public Visitor
{
public:
virtual void visitConcreteElementA(ConcreteElementA * c)
{
cout<<"ConcreteVisit2 operate on ConcreteElementA"<<endl;
}
virtual void visitConcreteElementB(ConcreteElementB *)
{
cout<<"ConcreteVisitor2 operate on ConcreteElementB"<<endl;
}
};
class Element
{
public:
virtual void accept(Visitor * visitor)=0;
};
class ConcreteElementA:public Element
{
public:
void accept(Visitor * visitor)
{
visitor->visitConcreteElementA(this);
}
};
class ConcreteElementB:public Element
{
public:
void accept(Visitor * visitor)
{
visitor->visitConcreteElementB(this);
}
};
class ObjectStructure
{
public:
void attach(Element *e)
{
elements.push_back(e);
}
void detach(Element *e)
{
elements.remove(e);
}
void accept(Visitor * v)
{
list<Element *>::iterator iter;
for(iter=elements.begin();iter!=elements.end();iter++)
{
(*iter)->accept(v);
}
}
private:
list<Element *> elements;
};
int main()
{
ObjectStructure * o=new ObjectStructure();
Element * a=new ConcreteElementA();
Element * b=new ConcreteElementB();
o->attach(a);
o->attach(b);
Visitor * v1=new ConcreteVisitor1();
Visitor *v2=new ConcreteVisitor2();
o->accept(v1);
o->accept(v2);
delete o;
delete a;
delete b;
delete v1;
delete v2;
}
运行输出:
设计模式之二十四:訪问者模式(Visitor)的更多相关文章
- 设计模式(二十四)——职责链模式(SpringMVC源码分析)
1 学校 OA 系统的采购审批项目:需求是 采购员采购教学器材 1) 如果金额 小于等于 5000, 由教学主任审批 (0<=x<=5000) 2) 如果金额 小于等于 10000, ...
- 设计模式之十五:訪问者模式(Visitor Pattern)
訪问者模式(Visitor Pattern)是GoF提出的23种设计模式中的一种,属于行为模式. 据<大话设计模式>中说算是最复杂也是最难以理解的一种模式了. 定义(源于GoF<De ...
- 设计模式入门之訪问者模式Visitor
//訪问者模式定义:表示一个作用于某对象结构中的各个元素的操作,它使你能够在不改变各元素类的前提下定义作用于这些元素的新操作. //从定义上看.这个模式跟装饰模式的定义非常类似(动态地给一个对象加入一 ...
- ASP.NET Core 3.0 : 二十四. 配置的Options模式
上一章讲到了配置的用法及内部处理机制,对于配置,ASP.NET Core还提供了一种Options模式.(ASP.NET Core 系列目录) 一.Options的使用 上一章有个配置的绑定的例子,可 ...
- 设计模式之(十四)责任链模式(Chain of Responsibility)
在业务场景中,有很多是需要审批的.审核方式还可能常常发生变化,而责任链模式就是为了解决这种场景的情况的. 责任链模式定义:十多个对象都有机会处理请求,从而避免发送者和接受者之间的耦合关系.讲这些对象连 ...
- 设计模式学习(二十四):Spring 中使用到的设计模式
设计模式学习(二十四):Spring 中使用到的设计模式 作者:Grey 原文地址: 博客园:设计模式学习(二十四):Spring 中使用到的设计模式 CSDN:设计模式学习(二十四):Spring ...
- JAVA设计模式之 訪问者模式【Visitor Pattern】
一.概述 訪问者模式是一种较为复杂的行为型设计模式,它包括訪问者和被訪问元素两个主要组成部分.这些被訪问的元素通常具有不同的类型,且不同的訪问者能够对它们进行不同的訪问操作.在使用訪问者模式时,被訪问 ...
- Java 设计模式系列(十四)命令模式(Command)
Java 设计模式系列(十四)命令模式(Command) 命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复 ...
- Bootstrap<基础二十四> 缩略图
Bootstrap 缩略图.大多数站点都需要在网格中布局图像.视频.文本等.Bootstrap 通过缩略图为此提供了一种简便的方式.使用 Bootstrap 创建缩略图的步骤如下: 在图像周围添加带有 ...
随机推荐
- C++模板类中使用静态成员变量(例如Singleton模式)
一个最简单Singleton的例子: ///////// Test.h /////////template <class _T>class CTest{private:_T n;stati ...
- linux文件属性
在Linux中,文件的属性是一个很重要的概念,用户或者用户组对一个文件所拥有的权限,都可以 从文件的属性得知.我们可以通过ls -al命令,列出某个文件夹下面的所有文件(包括以.开头的隐藏 文件).下 ...
- sharepoint 2010 使用自定义列表模版创建列表(2)
前面用的方法是通过界面上操作,根据自定义模版,创建的列表.sharepoint 2010 使用自定义列表模版创建列表(1) 这里顺便记录多另一种方法,通过程序来创建. ---------------- ...
- MinGW安装教程
首先说明一下 1) MinGw只是其中一种GCC编译环境的安装程序,还有像Cygwin也是差不多的; 2) 由于安装的时候有些地方忘了截图,所以图有些是借鉴别人的; 3) 还要就是安装MinGw,最好 ...
- Linux学习笔记6-Linux根目录下各个目录的作用
/bin:存放最常用命令: /boot:启动Linux的核心文件: /dev:设备文件: /etc:存放各种配置文件: /home:用户主目录: /lib:系统最基本的动态链接共享库: /mnt:一 ...
- ADO.NET改进版
ADO.NET从概念上来说是指定义一种与数据源进行交互的面向对象类库.类库即类的集合,也就是说ADO.NET主要是提供一了一些实现与数据源进行交互的一些类和接口. 其实就我个人看来,我觉得ADO.NE ...
- Java面试题之八
四十一.面向对象的特征有哪些方面 四大特征大家都知道:抽象.继承.封装.多态.这是个理解性表述题,每个人的表述方式可能都不一样.下面仅选择一种作为参考: 1.抽象: 抽象——就是忽略一个主题中与当前目 ...
- Windows下搭建Eclipse+Android4.0开发环境
官方搭建步骤: http://developer.android.com/index.html 搭建好开发环境之前须要下载以下几个文件包: 一.安装Java执行环境JRE(没这个Eclipse执行不起 ...
- ARM64调试环境
自从上一次ZCTF做了一道ARM64的逆向题目后,我决定记录下利用qemu搭建ARM64的环境的过程,以后肯定会遇到更多ARM平台下的Reverse和PWN. 一 安装QEMU 我要模拟的是64位的A ...
- hyper-v新内容
摘自http://geek.csdn.net/news/detail/30249 继开源.NET,微软推出Hyper-V Container技术及Nano Server Hyper-V Server ...