大话设计模式--访问者模式 Visitor -- C++实现实例
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++实现实例的更多相关文章
- 设计模式 -- 访问者模式(Visitor)
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------主要内容包括: 初识访问者模 ...
- C#设计模式——访问者模式(Visitor Pattern)
一.概述由于需求的改变,某些类常常需要增加新的功能,但由于种种原因这些类层次必须保持稳定,不允许开发人员随意修改.对此,访问者模式可以在不更改类层次结构的前提下透明的为各个类动态添加新的功能.二.访问 ...
- 大话设计模式--工厂模式 factory -- C++实现实例
实现<大话设计模式>的C++版本... 1. 工厂模式 使用的范围是 同一个基类,下面很多子类. (1)这里很容易出现的一个问题n多的子类继承自抽象基类,我们不得不在每次要用到子类的地方就 ...
- 大话设计模式--解释器模式 interpreter -- C++实现实例
1. 解释器模式: 给定一个语言,定义它的文法的一种表示 并 定义一个解释器,这个解释器使用该表示文法 来解释语言中的句子. 如果一种特定类型的问题发生的频率很高,那么可能就值得将该问题的各个实例表述 ...
- 大话设计模式--命令模式 Command -- C++实现实例
1. 命令模式: 将请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作. 命令模式有点: a. 较容易的设计一个命令队列 b. 在需要的的情况 ...
- 大话设计模式--桥接模式 Bridge -- C++实现实例
1. 桥接模式: 将抽象部分与它的实现部分分离,使它们都可以独立的变化. 分离是指 抽象类和它的派生类用来实现自己的对象分离. 实现系统可以有多角度分类,每一种分类都有可能变化,那么把这种多角度分离出 ...
- 大话设计模式--组合模式 Composite -- C++实现实例
1. 组合模式: 将对象组合成树形结构以表示"部分--整体"的层次结构,组合模式使用户对单个对象和组合对象的使用具有一致性. 需求中是体现部分与整体层次的结构时,希望用户可以忽略组 ...
- 大话设计模式--状态模式 State -- C++实现实例
1.状态模式: 当一个对象的内在状态改变时,允许改变其行为,这个对象看起来就像是改变了其类. 状态模式解决的是当控制一个对象状态转换的条件表达式过于复杂, 把状态的判断逻辑转移到表示不同状态的一系列类 ...
- 大话设计模式--建造者模式 Builder -- C++实现实例
1. 建造者模式,将一个复杂对象的构建与它的表示分离, 使得同样的构建过程可以创建不同的表示. 用户只需要指定需要建造的类型就可以得到他们,而具体建造的过程和细节就不需要知道了. 关键类Directo ...
随机推荐
- poj 2762 Going from u to v or from v to u?(强连通、缩点、拓扑)
题意:(理解错了)在一个洞穴中有多个room,要求任意选两个room:u.v,都能保证u.v之间有通路,注意洞穴中的路是有向边.. 分析:强连通子图中的点必然两两之间可以互通,两个强连通子图之间有通路 ...
- java 实现HttpRequest 发送http请求
package com.test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStr ...
- 《Lucene in Action》(第二版) 第一章节的学习总结 ---- 用最少的代码创建索引和搜索
第一章节是介绍性质,但是通过这一章节的学习,我理解到如下概念: 1.Lucene由两部分组成:索引和搜索.索引是通过对原始数据的解析,形成索引的过程:而搜索则是针对用户输入的查找要求,从索引中找到匹配 ...
- Carthage:去中心化的Cocoa依赖管理器
Cocoa的依赖管理器,我们已经有了CocoaPods,非常好用,那么为什么还要创建这样一个项目呢?本文翻译自Carthage的Github的README.md,带大家来了解一下这个工具有何不同之处. ...
- Linux高并发应用类型对系统内核的优化
Linux操作系统内核参数优化 net.ipv4.tcp_max_tw_buckets = net.ipv4.ip_local_port_range = net.ipv4.tcp_tw_recycle ...
- 从零开始学android -- notification通知
目前有三种通知 第一种是普通通知 看看效果 布局什么的太简单了我就不放在上面了给你们看核心的代码就行了 里面的 int notificationID = 1; //设置点击通知后的意图 Inten ...
- UFLDL深度学习笔记 (四)用于分类的深度网络
UFLDL深度学习笔记 (四)用于分类的深度网络 1. 主要思路 本文要讨论的"UFLDL 建立分类用深度网络"基本原理基于前2节的softmax回归和 无监督特征学习,区别在于使 ...
- CF:Problem 426B - Sereja and Mirroring 二分或者分治
这题解法怎么说呢,由于我是把行数逐步除以2暴力得到的答案,所以有点二分的意思,可是昨天琦神说是有点像分治的意思.反正总的来说:就是从大逐步细化找到最优答案. 可是昨晚傻B了.靠! 多写了点东西,然后就 ...
- 软RAID5制作流程
说明:本实验没有用到多个磁盘,而是利用单个磁盘划分出的多个分区来仿真的,如果在实际项目中,请依情况而定. 1. 分区 我这里划分6个分区,用4个分区组成RAID 5,用1个分区作为spare disk ...
- x-www-form-urlencoded名字的由来
1 提交的是表单数据 所以用form. 2 提交的形式是以参数放在url后面的形式提交的 例如,以x1=y1&x2=y2&x3=y3的形式放在url后面的形式提交,所以是urlenco ...