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

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

访问者模式

937862-20170308105119250-1384369850.png

template
class Element{public: virtual void accept(Visitor *vs) = 0; T & get_data() { return data; }private: T data;};template
class ElementA:public Element
{public: void accept(Visitor *vs) { vs.visitor(this); }};template
class ElementB:public Element{public: void accept(Visitor *vs) { vs.visitor(this); }};//visitor实际操作的地方,每增加一个操作就新增一个Visitor派生类class Visitor{public: virtual void visitor(ElementA *element) = 0; virtual void visitor(ElementB *element) = 0;};class Visitor1:public Visitor{public: void visitor(ElementA *element) { } void visitor(ElementB *element) { }};class Visitor2:public Visitor{public: void visitor(ElementA *element) { } void visitor(ElementB *element) { }};

优点:

  • 对扩展开放,对修改关闭。增加一种新的操作只需要增加一个Visitorn即可
  • 一个Visitorn只负责一种操作,单一指责原则

缺点:

  • 违反了最少知道原则,降低了封装度
  • 违反了依赖倒置原则,依赖了具体类
  • 不适合经常新增ElementX的情况

转载于:https://www.cnblogs.com/txlstars/p/6518305.html

你可能感兴趣的文章
iOS开发 __func__的使用
查看>>
iOS开发 使用fui(Find Unused Imports)扫描工程中不用的类
查看>>
Android组件化专题-路由动态注入跳转参数以及获取其他模块的fragment
查看>>
JavaScript中的执行机制
查看>>
WWDC2017-Customized Loading in WKWebView
查看>>
今天我才学会iOS的MVP写法
查看>>
Vue.js项目中管理每个页面的头部标签的方法
查看>>
function-表达式(内含自执行函数)
查看>>
2.字符串
查看>>
用Python从Unicode转换到中文并输出到文件
查看>>
阿里云弹性web托管使用教程
查看>>
Python爬虫之旅之Selenium库的使用
查看>>
『中级篇』Docker的收费模式(53)
查看>>
上传本地项目到远程仓库
查看>>
手写Android网络框架——CatHttp(一)
查看>>
【Python实战】用Scrapyd把Scrapy爬虫一步一步部署到腾讯云上,有彩蛋
查看>>
java架构-一些设计上的基本常识
查看>>
laravel5.5 + react完成简单的CRUD
查看>>
iOS中多Target的实现
查看>>
javax.persistence.TransactionRequiredException: Executing an update/delete query
查看>>