访问者模式的定义

定义: 封装一些作用于某种数据结构中的各元素的操作, 它可以在不改变数据结构的前提下定义作用于这些元素的新的操作

通俗的说, 就是定义一个访问者角色, 当对指定角色进行访问时要通过访问者进行访问

其类图如下:

各角色说明:

  1. Vistor 抽象访问者: 抽象类或接口, 声明访问者可以访问哪些元素, 具体到程序中就是 visit 方法的参数定义哪些对象是可以被访问的
  2. ConcreteVistor 具体访问者: 它影响访问者访问到一个类后该怎么干, 要做什么事
  3. Element 抽象元素: 接口或抽象类, 声明接受哪一类访问者访问, 程序上是通过 accept 方法中的参数来定义的
  4. ConcreteElement 具体元素: 实现 accept方法, 通常是 visitor.visit(this); 基本上都形成一种模式了
  5. ObjectStruture 结构对象: 元素的生成者, 一般容纳在多个不同类、不同接口的容器, 项目中一般很少抽象出这个角色

抽象元素代码:

具体元素代码:

抽象访问者代码:

具体访问者代码:

结构对象用来产生不同的元素对象, 代码如下:

场景类代码:

通过增加访问者, 这要是具体元素就非常容易访问, 对元素的遍历就更加容易了, 甭管它是什么对象, 只要它在一个容器中, 都可以通过访问者来访问, 任务集中化.

访问者模式的应用

访问者模式的优点:

  1. 符合单一职责原则. 具体元素角色负责数据的加载, 而访问者角色负责报表的展现, 两个不同的职责非常明确的分离开来, 各自演绎变化
  2. 优秀的扩展. 由于职责分开,继续增加 对数据的操作是非常快捷的.
  3. 灵活性非常高. 例如, 当需要对不同的具体元素进行分别统计时, 使用 instanceof 循环判断当然也可以, 但是现在有一个好办法, 那就是把它丢给访问者,由访问者来进行统计计算

访问者模式的缺点:

  1. 具体元素对访问者公布细节. 访问者要访问一个类就必然要求这个类公布一些方法和数据, 也就是说访问者关注了其他类的内部细节, 这也是迪米特法则所不建议的
  2. 具体元素变更比较困难. 具体元素角色的增加、删除、修改是比较困难的
  3. 违背了依赖倒置原则. 访问者依赖的是具体元素, 而不是抽象元素, 这破坏了依赖倒置原则, 特别是在面向对象的编程中, 抛弃了对 接口的依赖,而直接依赖实现类, 扩展比较难

访问者模式的应用场景:

  1. 一个对象结构包含很多类对象, 它们有不同的接口, 而你想对这些对象实施一些依赖于其具体类的操作, 也就是说用迭代器模式已经不能胜任的情景
  2. 需要对一个对象结构中的对象进行很多不同并且不相关的操作, 而你想避免让这些操作"污染"这些对象的类
  3. 业务规则要求遍历多个不同的对象. 这本身也是访问者模式的出发点, 访问者模式是对迭代器模式的扩充, 可以便利不同的对象, 然后执行不同的操作, 也就是针对访问的对象不同,执行不同的操作.
  4. 访问者模式还有一个 用途, 充当拦截器角色

访问者模式的扩展

1.统计功能

对不同的具体元素进行统计, 针对不同的具体元素针对性统计

比如统计员工工资, 经理和员工的工资情况不同, 使用访问者进行分别计算, 然后可以计算总额等

2.多个访问者

可以定义多个访问者, 每个访问者实现不同的功能

在IVistor 下再定义 接口继承 IVistor, 分别实现各自功能, 使用时传递不同的访问者有不同的表现


访问者模式是一种集中规整模式,特别使用于大规模重构的项目, 在这一个阶段需求已经非常清晰, 原系统的功能点也已经明确, 通过访问者模式可以很容易把一些功能进行梳理, 达到最终目的--功能集中化, 如一个统一的报表运算、UI展现等, 我们还可以与其它模式混编建立一套自己的过滤器或者拦截器

23种设计模式之访问者模式相关推荐

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

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

  2. 在王者荣耀角度下分析面向对象程序设计B中23种设计模式之访问者模式

    · 访问者模式在王者荣耀中的应用 · 一.简述 在王者荣耀的社交系统中有2大核心,一为好友系统二为战队系统,好友系统偏向于个人,战队系统偏向于一个集体.玩家可以自己筹备创建战队.亦可加入其他战队.战队 ...

  3. 深入理解23种设计模式(14) -- 访问者模式

    介绍 访问者模式 (Visitor Pattern) : 封装一些作用于某种数据结构的各元素操作,它可以在不改变数据结构的前提下定义作用于这些元素新的操作. 主要将数据结构与数据操作分离,解决数据结构 ...

  4. 【Unity与23种设计模式】访问者模式(Visitor)

    GoF中定义: "定义一个能够在一个对象结构中对于所有元素执行的操作.访问者让你可以定义一个新的操作,而不必更改到被操作元素的类接口." 暂时没有完全搞明白 直接上代码 //访问者 ...

  5. 23种设计模式7_代理模式之一静态代理

    23种设计模式7_代理模式之一静态代理 1 基本介绍 代理模式:为其他对象提供一种代理以控制对这个对象的访问 代理模式也叫委托模式,它是一项基本设计技巧.许多其他的模式,如状态模式.策略模式.访问者模 ...

  6. 23种设计模式——装饰者模式

    文章目录 23种设计模式--装饰者模式 1.装饰者模式概述 2.装饰者模式的结构 3.装饰者模式的实现 4.装饰者模式的应用场景 23种设计模式--装饰者模式 1.装饰者模式概述 背景 有些人为了早上 ...

  7. 实践GoF的23种设计模式:建造者模式

    本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:建造者模式>,作者: 元闰子. 简述 在程序设计中,我们会经常遇到一些复杂的对象,其中有很多成员属性,甚至嵌套着多个复杂的对象 ...

  8. 【Go实现】实践GoF的23种设计模式:命令模式

    上一篇:[Go实现]实践GoF的23种设计模式:代理模式 简单的分布式应用系统(示例代码工程):https://github.com/ruanrunxue/Practice-Design-Patter ...

  9. 23种设计模式之命令模式和策略模式的区别

    文章目录 概述 命令模式 策略模式 相同点 总结 概述 命令模式和策略模式确实很相似,只是命令模式多了一个接收者(Receiver)角色.它们虽然同为行为类模式,但是两者的区别还是很明显的.策略模式的 ...

最新文章

  1. HDU 5836 Rubik's Cube BFS
  2. oracle存储while用mysql_oracle存储过程while
  3. linux 批量处理 dos2unix
  4. 2017 《Java技术预备作业》
  5. mysql 当前记录集不支持书签_存储过程 分页。当前记录集不支持书签。这可能是提供程序或选定的游标类型的限制。...
  6. usb转rj45_笔记本接口不够怎么办?先看USB-A接口能转谁
  7. Linux常用C函数-接口处理篇(网络通信函数)
  8. Windows下的Qt Creator的安装
  9. 基于Token的身份验证——JWT
  10. 华为数通设备常用诊断命令
  11. ConcurrentHashMap 底层原理,你真的理解了吗?
  12. Facebook 与 Twitter 再曝漏洞!用户数据再次被共享?
  13. 用闭包方式实现点击a标签弹也索引值
  14. python包的init文件_Python模块包中__init__.py文件的作用
  15. Matlab系列教程_数值计算_求方差和标准差
  16. Android 加载SDCard中so库
  17. 程序识别验证码图片(一)
  18. windows xp系统本地磁盘图标发生变化——5种解决方法
  19. 智能手机平台:TI,Intel,Moto
  20. Apache顶级项目Ambari正式宣告退役!

热门文章

  1. LwIP应用开发笔记之七:LwIP无操作系统HTTP服务器
  2. 如何理解离散傅里叶变换(一)实数形式傅里叶变换
  3. Visual Studio 2010 sp1
  4. asp:dropdownlist如何去掉三角箭头_科目二倒库打轮早会压库角,教练9图详解如何快速调车避免压线?...
  5. 机器学习如何计算特征的重要性_机器学习之特征工程
  6. python中char的用法_如何从C++返回char **并使用cType在Python中填充它?
  7. 多线程百度网盘爬虫Python完整源码
  8. android xml通知栏权限配置,Android开发中 AndroidManifest.xml配置之service,receiver标签配置详解...
  9. linux 谷歌浏览器设置代理_linux下chrome+Proxy Switchy+ssh和firefox+autoproxy+ssh | 学步园...
  10. 学习C/C++的简单方法