访问者模式

在GOF的《设计模式:可复用面向对象软件的基础》一书中对访问者模式是这样说的:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。访问者模式把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化。该模式的目的是要把处理从数据结构分离出来。访问者模式让增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关的行为集中到一个访问者对象中。现在再来说说我之前经历过的那个项目。

使用场合

1.一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作;
2.需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而你想避免让这些操作“污染”这些对象的类。Visitor使得你可以将相关的操作集中起来定义在一个类中;
3.当该对象结构被很多应用共享时,用Visitor模式让每个应用仅包含需要用到的操作;
4.定义对象结构的类很少改变,但经常需要在此结构上定义新的操作。改变对象结构类需要重定义对所有访问者的接口,这可能需要很大的代价。如果对象结构类经常改变,那么可能还是在这些类中定义这些操作较好。

代码实现

// VisitorMode.cpp : Defines the entry point for the console application.
//#include "stdafx.h"
#include <iostream>
#include <vector>using namespace std;/
/** 双分派技术:* 函数调用哪一个有一下两点决定:1.消息接收者的类型 2.参数类型* C++只支持单分派,这里做一下dynamic_cast动态转换,提前检测一下接收者的类型*///
//  关键词:数据结构和数据操作分离;不同访问者产生不同结果; 行为模型;
//
//  场景:主要操作复杂元素对象。元素对象无须改变,元素的执行算法随着访问者改变而改变
//
//  案列说明:
//  公司有几本账,有大老板和二老板,两个人时长查阅账本,
//  大老板权限大,可以看所有账目
//  二老板权限小,只可以看部分账目
//
//  扩展实例1:大老板老婆,权限比大老板还要大,继承于大老板
//
///接口//
//接口特征:Visit和Accept接口,两个接口都有参数,都是对方类指针
//          Visit接口有多个重载
class ZhengBen;
class zhichu_ZhengBen;
class shouru_ZhengBen;class LingDao //访问者
{
public:virtual void Visit(ZhengBen *pZhengBen) = 0;virtual void Visit(zhichu_ZhengBen *pZhengBen) = 0;virtual void Visit(shouru_ZhengBen *pZhengBen) = 0;
};class ZhengBen    //元素类
{
public:virtual void Accept(LingDao *pLingDao) = 0;
};
//class DaLaoBan;
class ErLaoBan;class zhichu_ZhengBen : public ZhengBen
{
public:virtual void Accept(LingDao *pLingDao){pLingDao->Visit(this);}public:void ShowAll(){printf("展示-支出-所有内容\n");}void ShowPart(){printf("展示-支出-部分内容\n");}
};class shouru_ZhengBen : public ZhengBen
{
public:virtual void Accept(LingDao *pLingDao){pLingDao->Visit(this);}public:void ShowAll(){printf("展示-收入-所有内容\n");}void ShowPart(){printf("展示-收入-部分内容\n");}
};//大老板
class DaLaoBan : public LingDao
{
public:virtual void Visit(ZhengBen *pZhengBen){;}virtual void Visit(zhichu_ZhengBen *pZhengBen){pZhengBen->ShowAll();}virtual void Visit(shouru_ZhengBen *pZhengBen){pZhengBen->ShowAll();}
};//二老板
class ErLaoBan : public LingDao
{
public:virtual void Visit(ZhengBen *pZhengBen){;}virtual void Visit(zhichu_ZhengBen *pZhengBen){pZhengBen->ShowPart();}virtual void Visit(shouru_ZhengBen *pZhengBen){pZhengBen->ShowPart();}
};//扩展实例,大老板娘
class DaLaoBanNiang: public DaLaoBan
{};int _tmain(int argc, _TCHAR* argv[])
{zhichu_ZhengBen *pzhichu_ZhengBen = new zhichu_ZhengBen;//大老板看pzhichu_ZhengBen->Accept(new DaLaoBan);//二老板看pzhichu_ZhengBen->Accept(new ErLaoBan);//大老板娘看pzhichu_ZhengBen->Accept(new DaLaoBanNiang);return 0;
}

总结

设计模式中经常说的一句话是:发现变化并封装之。是否采用访问者模式,就要看“变化”是什么。访问者模式中,“变化”是具体访问者,其次是对象结构;但是,如果具体元素也会发生改变,就万万不能使用访问者模式,因为这样“牵一发而动全身”,后期的维护性就太差了。

C++设计模式之访问者模式相关推荐

  1. Java设计模式(访问者模式-迭代器模式-观察者模式-中介者模式)

    Java设计模式Ⅶ 1.访问者模式 1.1 访问者模式概述 1.2 代码理解 2.迭代器模式 2.1 迭代器模式概述 2.2 代码理解 3.观察者模式 3.1 观察者模式概述 3.2 代码理解 4.中 ...

  2. 北风设计模式课程---访问者模式(Visitor)

    北风设计模式课程---访问者模式(Visitor) 一.总结 一句话总结: 设计模式是日常问题的经验总结方案,所以学好设计模式对日常出现的问题可以有很好的解决. 访问者设计模式有点神似 抽象工厂模式, ...

  3. 设计模式之访问者模式(Visitor)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  4. 设计模式复习-访问者模式

    VisitorMode.h#pragma once #include<list> #include<string> #include<iostream> using ...

  5. 【设计模式】访问者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

    文章目录 一.访问者模式简介 二.访问者模式 适用场景 三.访问者模式 优缺点 四.访问者模式 与 迭代器模式 五.代码示例 1.Game 父类 ( 被访问者 ) 2.VipGame 收费游戏 ( 被 ...

  6. 设计模式:访问者模式(Vistor)

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

  7. java的string访问某个元素_C#深究.net常用的23种设计模式之访问者模式(Vistor Pattern)...

    一.引言 在上一篇博文中分享了责任链模式,责任链模式主要应用在系统中的某些功能需要多个对象参与才能完成的场景.在这篇博文中,我将为大家分享我对访问者模式的理解. 二.访问者模式介绍 2.1 访问者模式 ...

  8. Android设计模式之——访问者模式

    一.介绍 访问者模式是一种将数据操作与数据结构分离的设计模式,它是<设计模式>中23种设计模式中最复杂的一个,但它的使用频率并不高,正如<设计模式>的作者GOF对访问者模式的描 ...

  9. 设计模式(17) 访问者模式(VISITOR) C++实现

    意图: 表示一个作用于某对象结构的各元素的操作.它使你可以再不改变各元素的类的前提下定义作用于这些元素的新操作. 动机: 之前在学校的最后一个小项目就是做一个编译器,当时使用的就是访问者模式. 在静态 ...

最新文章

  1. python-docx操作
  2. 欠拟合、过拟合及其解决方法
  3. python【力扣LeetCode算法题库】42-接雨水(双指针法)
  4. ./configure,make,make install的作用
  5. html5 --- canvas绘制网格并画x、y轴
  6. 连载四:Oracle升级文章大全(完结篇)
  7. SQL Server窗口函数:ROWS与RANGE
  8. C++新特性探究(三):=default、=delete
  9. 黑马python培训视频网盘下载
  10. VUE Cascader省市二级联动 二级联动数据
  11. HTML---复选框默认打钩
  12. 《excel应用大全》(excel home 编著)--学习摘抄笔记2
  13. xargs 重定向输出 示列分析
  14. 影像匹配基本算法(摄影测量)
  15. Win7系统自带的录屏工具怎么打开操作教学分享
  16. 销售易和纷享销客的“生存经”
  17. pr无法启动此程序因为计算机中丢失api,pr2017安装丢失的api
  18. UC 乐园辅助程序 抢地盘 自动打卡 刷乐园币
  19. 【FXCG】今日市场分析
  20. Python如何使用pip批量更新库版本

热门文章

  1. 方法引用_通过super引用父类的成员方法
  2. 字符串-字符串的查找和替换
  3. Redisson分布式锁实战-1:构建分布式锁
  4. jmetery压力测试工具
  5. android 字符串下标,android – 在TextView中为特定字符设置下标和上标?
  6. 白苹果了怎么强制开机_iphone X 手机进水开机卡白苹果怎么回事?
  7. 接收udp数据_聊聊UDP、TCP和实现一个简单的JAVA UDP小Demo
  8. GitLab初次安装后,登录GitLab网页的管理员账号和密码各是什么?
  9. MySQL 下载与配置教程(免安装版)
  10. Left 4 Dead升级补丁总汇(3663-3986)