訪问者模式:

定义了一个作用于一个类的一些操作,訪问者模式同意在不改变类的前提下添加一些操作。

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类图:



主要包括:

  1. Visitor:声明了一个全部訪问器都须要实现的接口。
  2. ConcreteVisitor:实现每一个訪问器都须要实现的接口,每一个操作知识实现了和特定类相关的一些算法。
  3. Element:定义了一个须要接受Visitor作为參数的accept方法。
  4. ConcreteElement:实现了accept方法的类。

  5. 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)的更多相关文章

  1. 设计模式(二十四)——职责链模式(SpringMVC源码分析)

    1 学校 OA 系统的采购审批项目:需求是 采购员采购教学器材 1) 如果金额 小于等于 5000,  由教学主任审批 (0<=x<=5000) 2) 如果金额 小于等于 10000,   ...

  2. 设计模式之十五:訪问者模式(Visitor Pattern)

    訪问者模式(Visitor Pattern)是GoF提出的23种设计模式中的一种,属于行为模式. 据<大话设计模式>中说算是最复杂也是最难以理解的一种模式了. 定义(源于GoF<De ...

  3. 设计模式入门之訪问者模式Visitor

    //訪问者模式定义:表示一个作用于某对象结构中的各个元素的操作,它使你能够在不改变各元素类的前提下定义作用于这些元素的新操作. //从定义上看.这个模式跟装饰模式的定义非常类似(动态地给一个对象加入一 ...

  4. ASP.NET Core 3.0 : 二十四. 配置的Options模式

    上一章讲到了配置的用法及内部处理机制,对于配置,ASP.NET Core还提供了一种Options模式.(ASP.NET Core 系列目录) 一.Options的使用 上一章有个配置的绑定的例子,可 ...

  5. 设计模式之(十四)责任链模式(Chain of Responsibility)

    在业务场景中,有很多是需要审批的.审核方式还可能常常发生变化,而责任链模式就是为了解决这种场景的情况的. 责任链模式定义:十多个对象都有机会处理请求,从而避免发送者和接受者之间的耦合关系.讲这些对象连 ...

  6. 设计模式学习(二十四):Spring 中使用到的设计模式

    设计模式学习(二十四):Spring 中使用到的设计模式 作者:Grey 原文地址: 博客园:设计模式学习(二十四):Spring 中使用到的设计模式 CSDN:设计模式学习(二十四):Spring ...

  7. JAVA设计模式之 訪问者模式【Visitor Pattern】

    一.概述 訪问者模式是一种较为复杂的行为型设计模式,它包括訪问者和被訪问元素两个主要组成部分.这些被訪问的元素通常具有不同的类型,且不同的訪问者能够对它们进行不同的訪问操作.在使用訪问者模式时,被訪问 ...

  8. Java 设计模式系列(十四)命令模式(Command)

    Java 设计模式系列(十四)命令模式(Command) 命令模式把一个请求或者操作封装到一个对象中.命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复 ...

  9. Bootstrap<基础二十四> 缩略图

    Bootstrap 缩略图.大多数站点都需要在网格中布局图像.视频.文本等.Bootstrap 通过缩略图为此提供了一种简便的方式.使用 Bootstrap 创建缩略图的步骤如下: 在图像周围添加带有 ...

随机推荐

  1. 如何让ios app支持32位和64位?

    将ios app转换为兼容32位和64位步骤:  1. 安装 Xcode 5.  2. 打开你的项目.Xcode会提示你更新你的项目,其中的警告和错误信息对于转换到64位相当重要.  3. 将你的项目 ...

  2. 100个linux常用命令

    1,echo “aa” > test.txt 和 echo “bb” >> test.txt //>将原文件清空,并且内容写入到文件中,>>将内容放到文件的尾部 2 ...

  3. linux命令之mount

    熟悉linux的同学都应该知道mount命令.在linux中,一切皆文件.硬盘分区都是以文件目录的方式存在. 如果我们想访问移动硬盘,U盘等我们必须将这些设备mount到我们linux文件系统中某个目 ...

  4. 匿名方法和Lambda表达式

    匿名方法本质上是一传递给委托的代码块,是使用委托的另一种方法. 规则: 1.匿名方法中不能使用跳转语句跳至次匿名方法的外部,反之亦然:匿名方法外部的跳转语句也不能跳转到匿名方法的内部: 2.在匿名方法 ...

  5. phpadmin

    一晚上都在调试数据库,都要疯了,整理如下: 0.Apache服务器的443端口与VMware的冲突,所以要更改配置文件.设为440就可以(这个随意). 1.因为要远程访问,默认密码为空,所以首先给ro ...

  6. rand,randn,randi函数区别

    1,rand 生成均匀分布的伪随机数.分布在(0~1)之间   主要语法:rand(m,n)生成m行n列的均匀分布的伪随机数             rand(m,n,'double')生成指定精度的 ...

  7. poj 3641 Pseudoprime numbers(快速幂)

    Description Fermat's theorem states that for any prime number p and for any integer a > 1, ap = a ...

  8. ffmpeg+SDl+ 播放器 -01

    最近因公司项目需要,打算自己在LINUX平台整一个播放器,来学习和研究音频编解码. 项目需求: 支持下列格式文件播放. 1> WMA 硬件解码,但需要软件分析ASF格式,提取Payload数据 ...

  9. 济南最新公交线路一览(BRT)

    济南最新公交线路一览(BRT) 济南BRT1路 高速公交线路 黄岗路东5:30-21:30 全福立交桥西5:30-21:30 票价1元,刷卡9折,月票有效 高速公交公司 去程:黄岗路东(BRT) - ...

  10. Hibernate征途(一)之初识

    相见恨晚 很久以前,大概从开始接触数据库开始,就闪过这样一个想法,怎么看怎么觉得数据库表和vb的类模块很像,不是么?除了vb类模块还有函数外:越往下学觉得二者越像,尤其在三层时学到实体类的概念,我去, ...