设计模式之访问者

访问者模式介绍

访问者模式能将算法与其所作用的对象隔离开来。

访问者模式建议将新行为放入要给名为访问者的独立类中,而不是试图将其整合到已有类中。

它允许你在不修改已有代码的情况下向已有类层次结构中增加新的行为。

需要执行操作的原始对象将作为参数被传递给访问者中的方法,让方法能访问对象所包含的一切必要数据。

简单理解下什么是访问者,这里使用保险代理人拜访不同层次的客户时为例子。他会根据不同的客户,推荐不同的保单。

  • 普通农民工,推荐医疗保险。

  • 普通打工人,推荐医疗保险和财产保险。

  • 企业家,推荐理财保险,年金等。

访问者模式结构

  • 访问者接口

声明一系列以对象结构的具体元素为参数的访问者方法。

  • 具体访问者

会为不同的具体元素类实现相同行为的几个不同版本。

  • 元素接口

声明一个方法来接收访问者。该方法必须有一个参数被声明为访问者接口类型。

  • 具体元素

实现元素接口方法,该方法的目的是根据当前元素类将其调用重定向到相应访问者的方法(注意:即使基类实现了此方法,所有子类都必须对其进行重写并调用访问者对象中的合适方法)。

  • 客户端

作为集合或其他复杂对象的代表。

适合应用场景

  • 需要对一个复杂对象结构中所有元素执行某些操作时。

  • 使用访问者模式来清理辅助行为的业务逻辑时。

  • 当某个行为只在类层次有意义,而在其他类中没有意义时。

实现方式

1、在访问者接口中声明一组“访问”方法,分别对应程序中的每个具体元素类。

2、声明元素接口,在具体原始类中实现接收方法。

3、元素类只能通过访问者接口与访问者进行交互(访问者必须知晓所有具体的元素类)。

4、为每个无法在元素层次结构中实现的行为创建一个具体访问者并实现所有的访问者方法。

5、客户端必须创建访问者对象并通过“接收”方法将其传递给元素。

优点

1、满足开闭原则和单一职责原则。

2、访问者对象可以在与各种对象交互时收集一些有用的信息。

缺点

1、每次在元素层次结构中添加或移除一个类时,你都要更新所有的访问者。

2、在访问者同某个元素进行交互时,它们可能没有访问元素私有成员变量和方法的必要权限。

Demo

元素接口与元素接口实现

元素接口与元素接口实现

访问者接口与接口实现

访问者接口与接口实现

客户端代码与Main()调用

客户端代码与Main()调用

访问者模式在常规的编码生活中很少会去使用,我们只需要掌握其原理就可以。对于在实际开发过程中,如果有满足此模式的业务,则可对其进行分解,按照访问者模式的结构进行构建即可。

显示结果

小寄语

人生短暂,我不想去追求自己看不见的,我只想抓住我能看的见的。

原创不易,给个关注。

我是阿辉,感谢您的阅读,如果对你有帮助,麻烦点赞、转发  谢谢。

- END -

往期推荐

设计模式总览

设计模式之简单工厂

设计模式之抽象工厂

设计模式之建造者

设计模式之原型

设计模式之单例

设计模式之适配器

设计模式之桥接

设计模式之组合

设计模式之装饰器

设计模式之外观

设计模式之享元

设计模式之代理

设计模式之责任链

设计模式之命令

设计模式之迭代器

设计模式之中介者

设计模式之备忘录

设计模式之观察者

设计模式之状态

设计模式之策略

设计模式之模板方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/299258.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql没有东西的商品_MYSQL 对商品表没有主图的数据调整为下架的SQL脚本

在实际的场景中,存在一些商品,没有主图的信息,但是商品跟对应价格都是上架的,这时候用户叫你,把一些商品没有主图的,跟对应的价格都弄为下架,这时候你该如何处理??在商品…

转-SQL 2005修改系统表

FROM:http://blog.csdn.net/liangCK/archive/2008/10/07/3029315.aspx 在 SQL Server 2000 中修改系统表的方法大部分人都知道,介绍如何在 SQL 2005 中修改系统表的资料目前还比较少,虽然微软不赞成修改系统表,而且也把修改系统表…

温州人的思维

思维(1):商人:没人干过这种事,没有先例可循,万一砸了怎么办?温州人:没人干过怕什么?这样才没人跟你抢市场嘛,头道汤味道最好,先人一步的生意最赚钱…

清华男神再获世界大奖,从放牛娃到清华校长,他考研3次,读博7年,做出诺奖级的科研成果...

全世界只有3.14 % 的人关注了爆炸吧知识2月24日,菲列兹伦敦奖评奖委员会宣布,2020年度菲列兹伦敦奖将授予中国科学院院士、清华大学副校长、北京量子信息科学研究院院长薛其坤。帅气的老薛按照评奖委员会的通知,薛其坤是因为在实验上发现量子…

安装MHA中清理Relay log报错

安装MHA中清理Relay log报错[rootMHA3 ~]# /usr/bin/purge_relay_logs --userroot --password123456 -disable_relay_log_purge --port3306 --workdir/opt/mysql/data/2014-08-27 09:19:30: purge_relay_logs script started.install_driver(mysql) failed: Cant locate DBD/m…

mysql序列increment_MySQL 序列 AUTO_INCREMENT

MySQL序列是一组整数:1, 2, 3, ...,由于一张数据表只能有一个字段自增主键, 如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现。本章我们将介绍如何使用MySQL的序列。使用AUTO_INCREMENTMySQL中最简单使用序列的方法…

SQL 语句中 where 条件后 写上1=1 是什么意思

前言where 11是sql语句条件逻辑判断表达式,由于11成立,恒为真,该表达式11将始终返回"真"。这种写法实际目的是为了获取逻辑值"True",其实诸如22, 123,中中等之类的写法都可以返回逻辑值"True"&…

介绍自定义JDataGrid电子表格版本公式中的函数?

2019独角兽企业重金招聘Python工程师标准>>> How to write function in JDataGrid Spreadsheet Edition? 1. Understand the formula and function API used in JDataGrid Spreadsheet Edition? Obviously you should understand the “Function” and it’s su…

最新研究!新冠病毒被定义为“大流行”背后,竟然还藏着这样凶险的大杀器?...

全世界只有3.14 % 的人关注了爆炸吧知识你知道当一种疾病被定义为大流行(pandemic)时意味着什么吗?大流行(pandemic) 是指一种疾病在短时间内越过省界国界甚至洲界在全世界范围内流行。历史上,有很多疾病都…

js javaScript array 取指定元素索引、判断是否相同、重复、过滤数据

最近写js也多了&#xff0c;Array中有好多方法不够用。自己加了些以后还可能用到。 <script type"text/javascript"> //找到返回所在索引&#xff0c;不存在返回-1 Array.prototype.index function (el) { var i 0; for (var i 0, len this.length; i <…

Linux下查看进程对应的命令绝对路径

为什么80%的码农都做不了架构师&#xff1f;>>> 由于开发环境混乱&#xff0c;多人共享一台物理机&#xff0c;部分软件不是通过系统管理软件中心安装&#xff08;例如&#xff1a;rpm&#xff0c;apt-get&#xff09;, 同时启动软件是在软件当前目录执行 ./XXX 。…

请收藏!这可能是目前最安全的数据加密传输解决方案

问题为了安全性起见&#xff0c;客户要求客户端必须将数据加密后才能传给服务端。起先&#xff0c;准备使用非对称加密&#xff08;RSA&#xff09;方式&#xff0c;但是发现它对原始文本长度有限制。而对称加密(AES)没有长度限制&#xff0c;但是使用固定密钥存在暴露的风险。…

mysql kill hup_kill -HUP pid

kill -HUP pid其中 pid 是进程标识。如果想要更改配置而不需停止并重新启动服务&#xff0c;请使用该命令。在对配置文件作必要的更改后&#xff0c;发出该命令以动态更新服务配置。根据约定&#xff0c;当您发送一个挂起信号(信号 1 或 HUP)时&#xff0c;大多数服务器进程(所…

Windows Live Essentials Wave3 QFE 官方各组件独立安装包

版本是14.0.8064.0206&#xff0c;签名日期为&#xff1a;2009-2-7 可根据自己的需要选择下载安装&#xff01;均可安装在SERVER版上&#xff01; Live Messenger | Live contacts &#xff08;安装Live Messenger的话&#xff0c;contacts 必须&#xff09; Live Writer Live …

厉害了!平均年龄8岁的抽象派画家,网友笑称:这些作品,康定斯基看了都得服气!...

全世界只有3.14 % 的人关注了爆炸吧知识在孩子们的眼中&#xff0c;世间万物都被赋予了无限的想象力&#xff0c;而绘画是他们独特想法和思维的表达。小鸟为什么在水里&#xff1f;因为它想学习游泳。鱼儿为什么会在天上&#xff1f;因为它想看看大地。一支小小的画笔&#xff…

COM组件与.NET技术对比

一、元数据 在COM中所有组件信息都存储在类型库中。.NET中信息都存储在数据集中。一些COM组件有类型库&#xff0c;一些却没有&#xff08;如VB编的&#xff0c;因为C可以用IDL——接口定义语言表述接口和方法&#xff0c;而VB不行&#xff09;。没有的话需要用C头文件来表述接…

Zabbix如何监控Windows机器

最近一直在研究Zabbix监控Windows机器&#xff0c;涉及到如何快速安装agent,如何修改和完善windows监控模板等等。想把自己的经验给大家分享一下&#xff0c;希望对大家有所帮助。1)安装agent客户端 首先分享一下用bat写的自动化安装Windows机器的agentd安装脚本,脚本里面的tc…

如何写出高质量代码

教你写出高质量代码的方法网络上有很多&#xff0c;比如设计原则、设计模式、重构技巧、命名规范等&#xff0c;以上这些本文统统都不会讲。个人理解高质量代码一定是结合业务并深度思考过的产出。很多人拿到需求后&#xff0c;业务和流程还没理顺后就直接编码&#xff0c;然后…

mysql的查表语句_mysql查表语句_MySQL

bitsCN.commysql查表语句[sql]describe table_name;这个命令用来显示一个表格的结构------------------------------------------------| Field | Type | Null | Key | Default | Extra |------------------------------------------------| ID | int(11) | NO | PRI | NULL | …

AOP技术研究 再续

第四部分 .Net平台AOP技术研究 4.1.Net平台AOP技术概览 .Net平台与Java平台相比&#xff0c;由于它至今在服务端仍不具备与unix系统的兼容性&#xff0c;也不具备类似于Java平台下J2EE这样的企业级容器&#xff0c;使 得.Net平台在大型的企业级应用上&#xff0c;常常为人所诟…