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. objective-C中的扩展方法与partial class

     在c#中要扩展一个现有类非常easy,比方这样: ? 1 2 3 4 5 6 7 public static class Utils {     public static void PrintTo ...

  2. gulp配置,实例演示

    项目完成后的目录 我们所需要的插件为:gulp-minify-css gulp-concat gulp-uglify gulp-rename del 如下图所示,完成后的项目目录结构: 附加,获取pa ...

  3. ArrayList add remove 代码分析

    Add 首次add 元素需要对数组进行扩容(初始化Capacity 10, 第二次扩容10>>1 为5, 第三次扩容15>>1 为7), 每次扩容之前长度的1.5倍,当add ...

  4. linux centos apache开启gzip的方法

    开启gzip压缩的方法很简单,连接服务器并打开配置文件“httpd.conf”,找到下面这两句,去掉前面的“#”  代码如下 1 LoadModule deflate_module modules/m ...

  5. Mac OS X 安装Ruby

    安装CocoaPods第一步 起因:重装系统后需要重新安装CocoaPods网上搜了下发现很多都过时了,已经不能用了.而且taobao Gems源已经停止服务,现在有ruby-china提供服务 PS ...

  6. Hibernate: 数据持久层框架

    Hibernate 是一种Java语言下的对象关系映射解决方案. 它是使用GNU宽通用公共许可证发行的自由.开源的软件.它为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架.Hi ...

  7. 同样的代码在java和c++中结果不同

    #include <iostream> using namespace std; /* run this program using the console pauser or add y ...

  8. Android 适配(drawable文件夹)图片适配(二)

    参考自(https://blog.csdn.net/myoungmeng/article/details/54090891) Android资源文件存放: android的drawable文件一共可以 ...

  9. 手机touch事件

    touchstart:触摸开始的时候触发 touchmove:手指在屏幕上滑动的时候触发 touchend:触摸结束的时候触发 而每个触摸事件都包括了三个触摸列表,每个列表里包含了对应的一系列触摸点( ...

  10. android菜鸟学习笔记24----与服务器端交互(一)使用HttpURLConnection和HttpClient请求服务端数据

    主要是基于HTTP协议与服务端进行交互. 涉及到的类和接口有:URL.HttpURLConnection.HttpClient等 URL: 使用一个String类型的url构造一个URL对象,如: U ...