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. Java利用Axis远程调用WebService接口

    准备工作: 主要依赖的包: 1.axis.jar 官网:http://axis.apache.org/axis/ 2.jaxrpc.jar 下载地址:http://www.java2s.com/Cod ...

  2. Sphinx之配置文件

    # # Sphinx configuration file sample # # WARNING! While this sample file mentions all available opti ...

  3. Android开发和Android Studio使用教程

    Android studio安装和简单介绍http://www.jianshu.com/p/36cfa1614d23 是时候把Android 项目切换到Android Studio http://ww ...

  4. [译]GLUT教程 - 子菜单

    Lighthouse3d.com >> GLUT Tutorial >> Pop-up Menus >> Sub Menus 上一节我们介绍了如何创建普通菜单和如果 ...

  5. 交换两个变量的值不使用第三个变量(Java)

    关于这个问题网上有好多答案,最近有人说这是个奇葩问题 个人测试了一把,如果是普通的数字的话,基本上没有问题 public static void main(String[] args) { int a ...

  6. NOJ1167 丑陋数 想法题

    题意 丑陋数n的意思是n的全部素数因子仅仅有2,3,5. 求出前1500个丑陋数. (第一个丑陋数是1) 思路 用一个数组维护全部的丑陋数. 一開始数组中仅仅有一个数就是1. 如今能够确定的丑陋数还有 ...

  7. Mysql主从配置笔记

    1.配置my.cnf无效,且mysql进程无法启动 从5.1.7版本开始,不再支持my.cnf直接配置master-host等主从相关配置选项(依然支持replicate-do-db).改为使用 CH ...

  8. SVM支持向量机

    支持向量机(Support Vector Machine,SVM)是效果最好的分类算法之中的一个. 一.线性分类器: 一个线性分类器就是要在n维的数据空间中找到一个超平面,通过这个超平面能够把两类数据 ...

  9. 【BZOJ2407/4398】探险/福慧双修 最短路建模

    [BZOJ2407]探险 Description 探险家小T好高兴!X国要举办一次溶洞探险比赛,获奖者将得到丰厚奖品哦!小T虽然对奖品不感兴趣,但是这个大振名声的机会当然不能错过! 比赛即将开始,工作 ...

  10. (转)Java并发编程:阻塞队列

    原文地址: http://www.cnblogs.com/dolphin0520/p/3932906.html 一.几种主要的阻塞队列 自从Java 1.5之后,在java.util.concurre ...