博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式-行为-Visitor(访问者)模式
阅读量:7215 次
发布时间:2019-06-29

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

hot3.png

问题:

    oop开发中经常遇到需求变更,设计好的一个系统原型,客户的新需求来了,我们不得不更改已有的饿设计,最常见的方案就是

添加新类 或 新方法 来实现需求,这样机会不停的打补丁,设计不可能封闭,

访问者模式就是把要变动的 ,更新的 封装到一个类中(访问操作),由待更改的类提供一个接受接口,在不改变数据结构的情况下

,添加新功能(不修改Element的条件下 添加新操作,可通过扩展子类)

这里涉及到一个Double Dispatch 问题

具体调用哪一个Accept 由2个决定因素

  1. Accept是多态操作,所以要具体的Element 子类

  2. 因为Accept 参数类型是Visitor 要实际ConcreateVisitor才能决定。

所以要派发2次,访问者模式就是Double Dispatch的一种实现

关于double dispatch 在       阐述

  1. Visitor 可以为每个Element写一个访问接口,也可以通过重载或 RTTI 来简化接口的设计

101707_8FAT_1391394.png

#include "PublicHeaders.h"#pragma onceclass Visitor; class Element{public:	void Print()	{		cout << " this is element" << __FUNCTION__ << endl;	}	/**	* @brief the interface of visitor's visit	*/	virtual void Accept(Visitor *visitor) = 0;};class Visitor{public:	virtual void VisitElementA(Element*ele) = 0;};class ConCreateVisitor :public Visitor{public:	void VisitElementA(Element *ele)	{		ele->Print();	}};class ConCreateElementA :public Element{public:	virtual void Accept(Visitor *visitor)override	{		visitor->VisitElementA(this);	}};void testVisitor(){	Element *ele = new ConCreateElementA;	Visitor *vis = new ConCreateVisitor;	ele->Accept(vis);}

转载于:https://my.oschina.net/kkkkkkkkkkkkk/blog/670610

你可能感兴趣的文章
***微信公众平台开发: 获取用户基本信息+OAuth2.0网页授权
查看>>
第二章 例题2-2 在屏幕上显示两个短句
查看>>
【转】iOS学习之适配iOS10
查看>>
OC语言BLOCK和协议
查看>>
C++创建一个动态链接库工程
查看>>
(六)maven之本地仓库
查看>>
如何使用 SPICE client (virt-viewer) 来连接远程虚拟机桌面?
查看>>
CentOS7
查看>>
linux高编IO-------tmpnam和tmpfile临时文件
查看>>
微信的机器人开发
查看>>
从零开始学Java(二)基础概念——什么是"面向对象编程"?
查看>>
近期面试总结(2016.10)
查看>>
CodeForces 525D Arthur and Walls :只包含点和星的矩阵,需要将部分星变成点使满足点组成矩形 : dfs+思维...
查看>>
积累_前辈的推荐
查看>>
strcpy和memcpy的区别《转载》
查看>>
在windows平台下electron-builder实现前端程序的打包与自动更新
查看>>
DroidPilot V2.1 手写功能特别版
查看>>
COOKIE欺骗
查看>>
js 强转规范解读
查看>>
ACdream - 1735:输油管道
查看>>