1. 访问者模式: 表示一个作用于某对象结构中的和元素的操作,它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

访问者模式把数据结构和作用于结构上的操作之间的耦合脱开,使得操作集合可以相对自由地演化。

访问者模式的目的是把处理从数据结构分离出来,适用于 有比较稳定的数据结构,又有易于变化的算法。

添加新的操作很简单,只需要添加一个新的访问者就可以了。

实例:

action.h action.cpp  扮演访问者的角色,添加新操作,添加其子类实例就可以了

#ifndef ACTION_H
#define ACTION_H class Man;
class Woman; class Action
{
public:
Action();
void virtual getManConclusion(Man *man)=0;
void virtual getWomanConclusion(Woman *woman)=0;
}; #endif // ACTION_H
#include "action.h"
#include "man.h"
#include "woman.h" Action::Action()
{
}

successaction.h successaction.cpp

#ifndef SUCCESSACTION_H
#define SUCCESSACTION_H #include "action.h" class SuccessAction : public Action
{
public:
SuccessAction();
void getManConclusion(Man *man);
void getWomanConclusion(Woman *woman);
}; #endif // SUCCESSACTION_H
#include "successaction.h"
#include <stdio.h> SuccessAction::SuccessAction()
{
} void SuccessAction::getManConclusion(Man *man)
{
printf("Success man , a woman on back \n");
} void SuccessAction::getWomanConclusion(Woman *woman)
{
printf("Success woman , lots of unsuccessfull man on back\n");
}

failaction.h failaction.cpp

#ifndef FAILACTION_H
#define FAILACTION_H #include "action.h" class FailAction : public Action
{
public:
FailAction();
void getManConclusion(Man *man);
void getWomanConclusion(Woman *woman);
}; #endif // FAILACTION_H
#include "failaction.h"
#include <stdio.h> FailAction::FailAction()
{
} void FailAction::getManConclusion(Man *man)
{
printf("Fail man, lots of woman on back\n");
} void FailAction::getWomanConclusion(Woman *woman)
{
printf("Fail woman, lots of man on back\n");
}

persion.h persion.cpp

#ifndef PERSION_H
#define PERSION_H #include "action.h" class Persion
{
public:
Persion();
void virtual accept(Action *visitor);
}; #endif // PERSION_H
#include "persion.h"

Persion::Persion()
{
} void Persion::accept(Action *visitor)
{
}

man.h man.cpp

#ifndef MAN_H
#define MAN_H #include "persion.h" class Man : public Persion
{
public:
Man();
void accept(Action *visitor);
}; #endif // MAN_H
#include "man.h"

Man::Man()
{
} void Man::accept(Action *visitor)
{
visitor->getManConclusion(this);
}

woman.h woman.cpp

#ifndef WOMAN_H
#define WOMAN_H #include "persion.h" class Woman : public Persion
{
public:
Woman();
void accept(Action *visitor);
};
#endif // WOMAN_H
#include "woman.h"

Woman::Woman()
{
} void Woman::accept(Action *visitor)
{
visitor->getWomanConclusion(this);
}

main.cpp

#include <iostream>
#include "man.h"
#include "woman.h"
#include "failaction.h"
#include "successaction.h"
using namespace std; int main()
{
cout << "Visitor test!" << endl; Persion *man = new Man();
Persion *woman = new Woman();
Action *success = new SuccessAction();
Action *fail = new FailAction(); man->accept(success);
man->accept(fail);
woman->accept(success);
woman->accept(fail); delete man;
delete woman;
delete success;
delete fail; return 0;
}

大话设计模式--访问者模式 Visitor -- C++实现实例的更多相关文章

  1. 设计模式 -- 访问者模式(Visitor)

    写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------主要内容包括: 初识访问者模 ...

  2. C#设计模式——访问者模式(Visitor Pattern)

    一.概述由于需求的改变,某些类常常需要增加新的功能,但由于种种原因这些类层次必须保持稳定,不允许开发人员随意修改.对此,访问者模式可以在不更改类层次结构的前提下透明的为各个类动态添加新的功能.二.访问 ...

  3. 大话设计模式--工厂模式 factory -- C++实现实例

    实现<大话设计模式>的C++版本... 1. 工厂模式 使用的范围是 同一个基类,下面很多子类. (1)这里很容易出现的一个问题n多的子类继承自抽象基类,我们不得不在每次要用到子类的地方就 ...

  4. 大话设计模式--解释器模式 interpreter -- C++实现实例

    1. 解释器模式: 给定一个语言,定义它的文法的一种表示 并 定义一个解释器,这个解释器使用该表示文法 来解释语言中的句子. 如果一种特定类型的问题发生的频率很高,那么可能就值得将该问题的各个实例表述 ...

  5. 大话设计模式--命令模式 Command -- C++实现实例

    1. 命令模式: 将请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作. 命令模式有点: a. 较容易的设计一个命令队列 b. 在需要的的情况 ...

  6. 大话设计模式--桥接模式 Bridge -- C++实现实例

    1. 桥接模式: 将抽象部分与它的实现部分分离,使它们都可以独立的变化. 分离是指 抽象类和它的派生类用来实现自己的对象分离. 实现系统可以有多角度分类,每一种分类都有可能变化,那么把这种多角度分离出 ...

  7. 大话设计模式--组合模式 Composite -- C++实现实例

    1. 组合模式: 将对象组合成树形结构以表示"部分--整体"的层次结构,组合模式使用户对单个对象和组合对象的使用具有一致性. 需求中是体现部分与整体层次的结构时,希望用户可以忽略组 ...

  8. 大话设计模式--状态模式 State -- C++实现实例

    1.状态模式: 当一个对象的内在状态改变时,允许改变其行为,这个对象看起来就像是改变了其类. 状态模式解决的是当控制一个对象状态转换的条件表达式过于复杂, 把状态的判断逻辑转移到表示不同状态的一系列类 ...

  9. 大话设计模式--建造者模式 Builder -- C++实现实例

    1. 建造者模式,将一个复杂对象的构建与它的表示分离, 使得同样的构建过程可以创建不同的表示. 用户只需要指定需要建造的类型就可以得到他们,而具体建造的过程和细节就不需要知道了. 关键类Directo ...

随机推荐

  1. 【NOI2015】【寿司晚宴】【状压DP】

    Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴. 小 G 和小 W 作为參加 NOI 的选手,也被邀请參加了寿司晚宴. 在晚宴上,主办方为大家提供了 n−1 种不 ...

  2. emacs的常用配置备份

    据说有人搞丢了自己的emacs的配置,然后一怒之下抛弃了emacs投身vim,我还是做个emacs配置的备份吧, 虽然我现在也算不上emacs的发烧友. 这里的配置大多是从网上参考的,最多的是下面的链 ...

  3. CentOS VSCode调试go语言出现:exec: "gcc": executable file not found in PATH

    CentOS VSCode调试go语言出现:exec: "gcc": executable file not found in PATH 解决方案: 执行如下命令安装GCC,然后重 ...

  4. 多媒体开发之rtp 打包发流---udp 丢包问题

    http://blog.csdn.net/acs713/article/details/19339707

  5. Android 下拉刷新上拉载入 多种应用场景 超级大放送(上)

    转载请标明原文地址:http://blog.csdn.net/yalinfendou/article/details/47707017 关于Android下拉刷新上拉载入,网上的Demo太多太多了,这 ...

  6. spring bean的scope

    scope用来声明容器中的对象所应该处的限定场景或者说该对象的存活时间,即容器在对象进入其相应的scope之前,生成并装配这些对象,在该对象不再处于这些scope的限定之后,容器通常会销毁这些对象. ...

  7. CAFFE学习笔记(一)Caffe_Example之训练mnist

    0.参考文献 [1]caffe官网<Training LeNet on MNIST with Caffe>; [2]薛开宇<读书笔记4学习搭建自己的网络MNIST在caffe上进行训 ...

  8. M - 基础DP

    M - 基础DP Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Descriptio ...

  9. Intellij IDEA打开多项目窗口

    我版本是2016.02.04 其他版本可能不一样的设置

  10. [note]树链剖分

    树链剖分https://www.luogu.org/problemnew/show/P3384 概念 树链剖分,是一种将树剖分成多条不相交的链的算法,并通过其他的数据结构来维护这些链上的信息. 最简单 ...