Design Pattern Visitor 訪问者设计模式
訪问者设计模式是已经有了一组Person对象了,然后不同的訪问者訪问这组对象。会有不同效果。
这些訪问者实际上就是一个能够让Person对象组运行的动作行为等。
至于这些Person对象是怎样运行这些訪问者的动作的,那是已经在特定的不同的Person对象中设计好的。
比方我们的訪问者或许是一些动作集合的类,如:
class Action
{
public:
string present;
string gun;
virtual void drinkBeer(Person *p) = 0;
virtual void getAGun(Person *p) = 0;
};
依据这个訪问者基类定义不同的訪问动作:
class ActionOne:public Action
{
public:
ActionOne()
{
present = "Alcohol";
gun = "Laiser";
}
void drinkBeer(Person *p);
void getAGun(Person *p);
}; class ActionTwo:public Action
{
public:
ActionTwo()
{
present = "Beer";
gun = "Machine Gun";
}
void getAGun(Person *p);
void drinkBeer(Person *p);
};
而Person类则运行动作类的不同动作,也是基类动作的一部分,这样呈现出不同Person运行的行为不一样。
class Person
{
public:
string something;
virtual void receivedVisitor(Action *visitor) = 0;
}; class Bill:public Person
{
public:
Bill()
{
something = "food";
}
void receivedVisitor(Action *visitor)
{
puts("\nVisitor to Bill bring :");
puts(visitor->present.c_str());
visitor->drinkBeer(this);
}
}; class Mark:public Person
{
public:
Mark()
{
something = "Weapon";
}
void receivedVisitor(Action *visitor)
{
puts("\nVisitor to Mark bring :");
puts(visitor->gun.c_str());
visitor->getAGun(this);
}
};
使用一个类来存放这些对象:
class House
{
protected:
vector<Person *> vps;
public:
void addPerson(Person *p)
{
vps.push_back(p);
}
void receiver(Action *visitor)
{
for (int i = 0; i < (int)vps.size(); i++)
{
vps[i]->receivedVisitor(visitor);
}
}
~House()
{
for (int i = 0; i < (int)vps.size(); i++)
{
delete vps[i];
}
}
};
最后就在这个类对象中存放须要被訪问的对象,然后使用动作类来訪问这些对象。
总的来说也是思想并不太难的一个设计模式,可是要非常好实现还是不太easy的。
所有代码例如以下:
#include <stdio.h>
#include <iostream>
#include <string>
#include <vector>
using namespace std; class Person; class Action
{
public:
string present;
string gun;
virtual void drinkBeer(Person *p) = 0;
virtual void getAGun(Person *p) = 0;
}; class ActionOne:public Action
{
public:
ActionOne()
{
present = "Alcohol";
gun = "Laiser";
}
void drinkBeer(Person *p);
void getAGun(Person *p);
}; class ActionTwo:public Action
{
public:
ActionTwo()
{
present = "Beer";
gun = "Machine Gun";
}
void getAGun(Person *p);
void drinkBeer(Person *p);
}; class Person
{
public:
string something;
virtual void receivedVisitor(Action *visitor) = 0;
}; class Bill:public Person
{
public:
Bill()
{
something = "food";
}
void receivedVisitor(Action *visitor)
{
puts("\nVisitor to Bill bring :");
puts(visitor->present.c_str());
visitor->drinkBeer(this);
}
}; class Mark:public Person
{
public:
Mark()
{
something = "Weapon";
}
void receivedVisitor(Action *visitor)
{
puts("\nVisitor to Mark bring :");
puts(visitor->gun.c_str());
visitor->getAGun(this);
}
}; void ActionOne::drinkBeer(Person *p)
{
puts("Let's eat something");
puts(p->something.c_str());
} void ActionOne::getAGun(Person *p)
{
puts("Let's gear up");
puts(p->something.c_str());
} void ActionTwo::getAGun(Person *p)
{
puts("Let's gear up");
puts(p->something.c_str());
} void ActionTwo::drinkBeer(Person *p)
{
puts("Let's eat something");
puts(p->something.c_str());
} class House
{
protected:
vector<Person *> vps;
public:
void addPerson(Person *p)
{
vps.push_back(p);
}
void receiver(Action *visitor)
{
for (int i = 0; i < (int)vps.size(); i++)
{
vps[i]->receivedVisitor(visitor);
}
}
~House()
{
for (int i = 0; i < (int)vps.size(); i++)
{
delete vps[i];
}
}
}; int main()
{
House house;
house.addPerson(new Bill);
house.addPerson(new Mark);
ActionTwo gun;
ActionOne drink;
house.receiver(&gun);
house.receiver(&drink);
return 0;
}
运行:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2VuZGVuMjM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
Design Pattern Visitor 訪问者设计模式的更多相关文章
- Java设计模式(三) Visitor(訪问者)模式及多分派场景应用
基本概念 Visitor 封装一些作用于数据结构中的各元素的操作,不同的操作能够借助新的visitor实现.减少了操作间的耦合性 訪问者能够将数据结构和对数据的操作解耦,使得添加对数据结构的操作不须要 ...
- Design Pattern Explained 读书笔记二——设计模式序言
设计模式的由来: 20 世纪 90 年代初,一些聪明的开发者偶然接触到 Alexander(Christopher Alexander 的建筑师) 有关模式的工作.他们非常想知道,在建筑学成立的理论, ...
- 设计模式之十五:訪问者模式(Visitor Pattern)
訪问者模式(Visitor Pattern)是GoF提出的23种设计模式中的一种,属于行为模式. 据<大话设计模式>中说算是最复杂也是最难以理解的一种模式了. 定义(源于GoF<De ...
- C++ 设计模式 —— 訪问者(Visitor)
訪问者设计模式的实现借助于两个继承体系, (1)elements:一个是被操作的类(基类及其子类) (2)visitors:一个定义了一系列操作的訪问者(基类及其子类) 訪问者模式是一种行为型设计模式 ...
- 设计模式之二十四:訪问者模式(Visitor)
訪问者模式: 定义了一个作用于一个类的一些操作,訪问者模式同意在不改变类的前提下添加一些操作. Represent an operation to be performed on the elemen ...
- Design Pattern: Gof
Design Pattern: Gof 如果您学习设计模式(Design Pattern),看到Gof这个字,可不要呆呆的没有反应,Gof即Gang of four,也就是四人帮的意思,该设计模式名书 ...
- JAVA设计模式之 訪问者模式【Visitor Pattern】
一.概述 訪问者模式是一种较为复杂的行为型设计模式,它包括訪问者和被訪问元素两个主要组成部分.这些被訪问的元素通常具有不同的类型,且不同的訪问者能够对它们进行不同的訪问操作.在使用訪问者模式时,被訪问 ...
- C++设计模式实现--訪问者(Visitor)模式
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/L_Andy/article/details/36896645 一. 訪问者模式 定义:表示一个作用于 ...
- 设计模式入门之訪问者模式Visitor
//訪问者模式定义:表示一个作用于某对象结构中的各个元素的操作,它使你能够在不改变各元素类的前提下定义作用于这些元素的新操作. //从定义上看.这个模式跟装饰模式的定义非常类似(动态地给一个对象加入一 ...
随机推荐
- python中*号和**号的用法
1.乘法符号 2.可变长参数 当我们使用函数时,需要传入不定个数的位置参数时,就可以使用*号表示,即*args,以元组形式传入:需要传入不定个数的关键字参数时,使用**表示,即**kwargs,以字典 ...
- VBA Promming——入门教程
VBA Visual Basic for Applications(VBA)是Visual Basic的一种宏语言,是微软开发出来在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言.主要能用来 ...
- final关键字所修饰的类有什么特点
Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量. final类不能被继承,没有子类,final类中的方法默认是final的. final方法 ...
- RestTemplate Hashmap变为LinkedHashMap源码解读
使用restTemplate远程调用服务,正常应该接收List<HashMap>数据,但实际却是List<LikedHashMap>经过不断地debug,终于找到了数据被转换成 ...
- Luogu P3806 点分治模板1
题意: 给定一棵有n个点的树询问树上距离为k的点对是否存在. 分析: 这个题的询问和点数都不多(但是显然暴力是不太好过的,即使有人暴力过了) 这题应该怎么用点分治呢.显然,一个模板题,我们直接用套路, ...
- “打开ftp服务器上的文件夹时发生错误,请检查是否有权限访问该文件夹"
阿里云虚拟主机上传网站程序 问题场景:网页制作完成后,程序需上传至虚拟主机 注意事项: 1.Windows系统的主机请将全部网页文件直接上传到FTP根目录,即 / . 2. 如果网页文件较多,上传较慢 ...
- (8) tomcat中管理领域、角色及用户
srverlet Container或web应用程序本身都可以提供控制web应用程序资源的安全防护 前者称为容器管理的安全防护,或者称为应用程序管理安全防护 通过内嵌机制,tomcat提供一些安全防护 ...
- 编码&解码
编码与解码首先,明确一点,计算机中存储的信息都是二进制的 编码/解码本质上是一种映射(对应关系):比如‘a’用ascii编码则是65,计算机中存储的就是00110101,但是显示的时候不能显示0011 ...
- CentOS7安装Tomcat9并配置
划重点:安装tomcat之前必须先安装jdk 安装教程 1.下载 Tomcat 9 CentOS 7 下创建目录并下载文件:// 链接已更新 cd /usr/local/ mkdir tomcat ...
- Mysql 锁总结
锁 部分总结参考博客 http://b.codejs.cc/articles/2017/10/23/1508749325215.html http://blog.csdn.net/cug_jiang1 ...