博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(原创)c++11改进我们的模式之改进访问者模式
阅读量:7089 次
发布时间:2019-06-28

本文共 1459 字,大约阅读时间需要 4 分钟。

本次讲c++11改进我们的模式之改进访问者模式

访问者模式是GOF23个设计模式中比较复杂的模式之一,但是它的功能也很强大,非常适合稳定的继承层次中对象的访问,可以在不修改被访问对象的情况下,动态添加职责,这正是访问者模式强大的地方,但是它的实现又造成了两个继承层次的强烈耦合,这也是被人诟病的地方,可以说是让人爱又让人恨的模式。c++11实现的访问者模式将会解决这个问题。我们将在c++11版本的访问者模式中看到,定义新的访问者是很容易的,扩展性很好,被访问者的继承层次也不用做任何修改。具体代码:

template
struct Visitor;template
struct Visitor
: Visitor
{ using Visitor
::Visit; virtual void Visit(const T&) = 0;};template
struct Visitor
{ virtual void Visit(const T&) = 0;};

上面的代码为每个类型都定义了一个纯虚函数Visit。

下面看看被访问的继承体系如何使用Visitor访问该继承体系的对象。

struct stA;struct stB; struct Base{    	typedef Visitor
MytVisitor; virtual void Accept(MytVisitor&) = 0;}; struct stA: Base{ double val; void Accept(Base::MytVisitor& v) { v.Visit(*this); }}; struct stB: Base{ int val; void Accept(Base::MytVisitor& v) { v.Visit(*this); }}; struct PrintVisitor: Base::MytVisitor{ void Visit(const stA& a) { std::cout << "from stA: " << a.val << std::endl; } void Visit(const stB& b) { std::cout << "from stB: " << b.val << std::endl; }};

测试代码:

void TestVisitor(){	PrintVisitor vis;    	stA a;    	a.val = 8.97;    	stB b;    	b.val = 8;     	Base* base = &a;    	base->Accept(vis);    	base = &b;    	base->Accept(vis);}

 测试结果:

from stA: 8.97from stB: 8

  

 c++11 boost技术交流群:296561497,欢迎大家来交流技术。

转载地址:http://uayql.baihongyu.com/

你可能感兴趣的文章
计算机基础——指令与程序
查看>>
用三段 140 字符以内的代码生成一张 1024×1024 的图片<转载>
查看>>
HTML CSS
查看>>
sqlserver存储过程中SELECT 与 SET 对变量赋值的区别
查看>>
【分享】开源富文本编辑器之间的较量
查看>>
logback的使用和logback.xml详解
查看>>
Android Studio -- 关联源码
查看>>
leetcode Majority Element
查看>>
去除sql的前后半角全角空格
查看>>
图片在容器里水平垂直居中
查看>>
015PHP文件处理——文件处理flock 文件锁定 pathinfo realpath tmpfile tempname
查看>>
关系型数据库之MySQL
查看>>
算法笔记-二叉树
查看>>
编写一个在1,2,…,9(顺序不能变)数字之间插入+或-或什么都不插入,并输出计算结果总是100的所有可能性。...
查看>>
Java异常处理课后作业
查看>>
hrtf 旋转音效matlab实现
查看>>
__attribute__
查看>>
【Android每日一讲】2012.11.06 Android变脸 - 主题(Theme)实现
查看>>
redis 系列12 哈希对象
查看>>
QTP使用心得
查看>>