C++设计模式:访客模式
访客模式:通俗的说, 就是定义一个访问者角色, 当对指定角色进行访问时要通过访问者进行访问。
访客模式的侵入性适中,仅在被访问的类里面加一个对外提供接待访问者的接口。
访客模式的优点:
- 符合单一职责原则. 具体元素角色负责数据的加载, 而访问者角色负责报表的展现, 两个不同的职责非常明确的分离开来, 各自演绎变化.
- 优秀的扩展. 由于职责分开,继续增加 对数据的操作是非常快捷的.
访客模式应用场景:
- 对象结构中对象对应的类很少改变,但经常需要在此对象结构上定义新的操作。
- 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作"污染"这些对象的类,也不希望在增加新操作时修改这些类。
class Visitor;
//被访问类基类: 网站
class Website
{
public:
virtual ~Website(){ std::cout << "~Website()" << std::endl;}
virtual void accept(Visitor&) = 0;
};
//被访问类具体实现类: 淘宝网
class TaoBao : public Website
{
public:
void accept(Visitor &v) override;
void shopping();
};
//被访问类具体实现类: 优酷
class YouKu : public Website
{
public:
void accept(Visitor &v) override;
void playVideo();
};
//访客类基类
class Visitor
{
public:
Visitor() = default;
Visitor(const std::string &name) : m_name(name){}
virtual ~Visitor(){ std::cout << "~Visitor()" << std::endl;}
virtual void visit(TaoBao &web) = 0;
virtual void visit(YouKu &web) = 0;
protected:
std::string m_name{"unknow"};
};
//访客具体实现类: 普通游客用户
class GeneralVisitor : public Visitor
{
public:
void visit(TaoBao &web) override;
void visit(YouKu &web) override;
};
//访客具体实现类: VIP用户
class VIPVisitor : public Visitor
{
public:
VIPVisitor(const std::string &name) : Visitor(name){}
void visit(TaoBao &web) override;
void visit(YouKu &web) override;
};
//
void YouKu::accept(Visitor &v)
{
v.visit(*this);
}
void YouKu::playVideo()
{
std::cout << "Watch the video" << std::endl;
}
void TaoBao::accept(Visitor &v)
{
v.visit(*this);
}
void TaoBao::shopping()
{
std::cout << "Online shopping" << std::endl;
}
void GeneralVisitor::visit(TaoBao &web)
{
web.shopping();
}
void GeneralVisitor::visit(YouKu &web)
{
web.playVideo();
}
void VIPVisitor::visit(TaoBao &web)
{
std::cout << m_name << ": ";
web.shopping();
}
void VIPVisitor::visit(YouKu &web)
{
std::cout << m_name << ": ";
web.playVideo();
}
//测试
int main()
{
TaoBao tb;
YouKu yk;
GeneralVisitor gVisitor;
VIPVisitor vVisitor{"zhangsan"};
yk.accept(gVisitor);
tb.accept(gVisitor);
yk.accept(vVisitor);
tb.accept(vVisitor);
return 0;
}
从以上代码来看,当被访问类数量较多时,需要在访客类中对应的编写大量的方法。另外访客类中的方法实现依赖于被访客类的具体类,没有依赖于抽象类。
C++设计模式:访客模式的更多相关文章
- GoLang设计模式17 - 访客模式
说明 访客模式是一种行为型设计模式.通过访客模式可以为struct添加方法而不需要对其做任何调整. 来看一个例子,假如我们需要维护一个对如下形状执行操作的库: 方形(Square) 圆形(Circle ...
- 设计模式之visitor模式,人人能懂的有趣实例
设计模式,现在在网上随便搜都一大堆,为什么我还要写"设计模式"的章节呢? 两个原因: 1.本人觉得这是一个有趣的设计模式使用实例,所以记下来: 2.看着设计模式很牛逼,却不知道怎么 ...
- 每天一个设计模式-7 生成器模式(Builder)
每天一个设计模式-7 生成器模式(Builder) 一.实际问题 在讨论工厂方法模式的时候,提到了一个导出数据的应用框架,但是并没有涉及到导出数据的具体实现,这次通过生成器模式来简单实现导出成文本,X ...
- 每天一个设计模式-2 外观模式(Facade)
每天一个设计模式-2 外观模式(Facade) 1.生活中的示例 客户想要购买一台电脑,一般有两种方法: 1.自己DIY,客户需要知道组成电脑的所有电子器件,并且需要熟悉那些配件,对客户要求较高. ...
- 17. 星际争霸之php设计模式--职责链模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- 11. 星际争霸之php设计模式--备忘模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- 8. 星际争霸之php设计模式--享元模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- 7. 星际争霸之php设计模式--中介者模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- 6. 星际争霸之php设计模式--建造器模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
随机推荐
- mac 的 quickTime Player 设置播放速度
按住 option 点击 下一个视频的图标每次调整幅度为0.1,大于 1.9 声音会消失. 按住 option+J 调慢播放速度 option+L 调快播放速度 每次调整幅度为0.1
- Oracle数据库表空间查看和更改
set linesize 200 --设置输出一行字符个数为200 1.查看表空间名称和大小(单位MB) SELECT t.tablespace_name, round(SUM(bytes / (1 ...
- Hive数据导入Elasticsearch
Elasticsearch Jar包准备 所有节点导入elasticsearch-hadoop-5.5.1.jar /opt/cloudera/parcels/CDH-5.12.0-1.cdh5.12 ...
- tensorflow 中图像的读取
1. 使用gfile读入文件内容.输入的是String,输出3-D tensor.可惜的是输入不能是tensor def decode_jpg(path): r""" 读 ...
- 7、Shiro加密和加盐
这里我们以md5加密方法举例,首先我们写一个main方法测试我们的密码经过md5加密之后的得到什么样的字符串: /** * 书写方法测试Md5Hash将密码“houru”加密之后的密文 * 但是仅仅加 ...
- eclipse经常卡死
修改eclipse.ini 将启动内存,最小内存,最大内存都增大 eclipse是内存不够再去申请,直到有最大内存的 若上述方法不行则换eclipse eclipse有的版本是不稳定的,我用Ke ...
- Win7下使用TortoiseGit设置保存密码
1. 打开 TortoiseGit 设置,编辑 .gitconfig 文件,如图: 2. 添加下面两行配置,如图: [credential] helper = store 3. 保存退出即可
- Delphi加密解密算法
// 加密方法一(通过密钥加密解密)function EncryptString(Source, Key: string): string;function UnEncryptString(Sourc ...
- python学习中
python中的单引号.双引号.三引号的用法 网上也查找了资料,理解的都有些费劲 就自己验证了一下(主要是目前掌握的python知识,不知道什么时候会同时用到这三种引号) 用python3验证的 单引 ...
- excel导入导出(一)
excel导入导出 依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi& ...