目录

说明

实现方式

优点

缺点

应用场景

其他链接


说明

  • 行为型模式之一,其他还有命令模式、模板方法模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式)
  • 访问者模式(Visitor Pattern),封装一些作用于某种数据结构的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。

  • 主要将数据结构与数据操作分离,解决数据结构和操作耦合性问题

  • 访问者模式的基本工作原理是:在被访问的类里面加一个对外提供接待访问者的接口。


实现方式

华夏好声音海选现场,各路歌手齐聚舞台。评委老师庾虹庆(Man)、辣英(Woman)两位老师将对歌手进行测评。当看完某个歌手的表演后,主办方将得到他们对该歌手不同的评价(成功、失败、待定等)。

public class VisitorTest {public static void main(String[] args) {// 创建数据结构ObjectStructure,可以管理很多人ObjectStructure objectStructure = new ObjectStructure();objectStructure.attach(new Man());objectStructure.attach(new Woman());// 成功的反应Success success = new Success();objectStructure.display(success);System.out.println("===============");// 失败的反应Fail fail = new Fail();objectStructure.display(fail);System.out.println("===============");// 待定的反应Wait wait = new Wait();objectStructure.display(wait);}}/*** 抽象访问者(Visitor),为该对象结构中的ConcreteElement的每一个类声明一个visit操作* <p>** @author ZRH* @version 1.0.0* @date 2020/7/24*/
abstract class Action {/*** 得到男性的测评结果* <p>** @param man 男人* @return void* @author : ZRH* @version : 1.0.0* @date : 2020-07-24*/public abstract void getManEvaluationResult(Man man);/*** 得到女性的测评结果* <p>** @param woman* @return void* @author : ZRH* @version : 1.0.0* @date : 2020-07-24*/public abstract void getWomanEvaluationResult(Woman woman);
}/*** 状态类,是一个具体的访问者* <p>** @author ZRH* @version 1.0.0* @date 2020/7/24*/
class Success extends Action {@Overridepublic void getManEvaluationResult(Man man) {System.out.println(" 男人给的评价该歌手很成功 !");}@Overridepublic void getWomanEvaluationResult(Woman woman) {System.out.println(" 女人给的评价该歌手很成功 !");}}class Wait extends Action {@Overridepublic void getManEvaluationResult(Man man) {System.out.println(" 男人给的评价是该歌手待定 ..");}@Overridepublic void getWomanEvaluationResult(Woman woman) {System.out.println(" 女人给的评价是该歌手待定 ..");}}class Fail extends Action {/*** 失败状态的评测* <p>* @author ZRH* @date 2020-07-24* @version 1.0.0* @param man 男人* @return void*/@Overridepublic void getManEvaluationResult(Man man) {System.out.println(" 男人给的评价该歌手失败 !");}@Overridepublic void getWomanEvaluationResult(Woman woman) {System.out.println(" 女人给的评价该歌手失败 !");}}/*** Element类* <p>** @author ZRH* @version 1.0.0* @date 2020/7/24*/
abstract class Person {/*** 提供一个方法,让访问者可以访问* <p>** @param visitor* @return void* @author : ZRH* @version : 1.0.0* @date : 2020-07-24*/public abstract void accept(Action visitor);
}class Man extends Person {@Overridepublic void accept(Action action) {action.getManEvaluationResult(this);}}/*** 1. 这里使用到了双分派, 即首先在客户端程序中,将具体状态作为参数传递Woman中(第一次分派)* 2. 然后Woman 类调用作为参数的 "具体方法" 中方法getWomanResult, 同时将自己(this)作为参数传入,完成第二次的分派* <p>** @author ZRH* @version 1.0.0* @date 2020/7/24*/
class Woman extends Person {@Overridepublic void accept(Action action) {action.getWomanEvaluationResult(this);}}/*** 数据结构,管理很多人(Man , Woman) ,能枚举它的元素, 可以提供一个高层的接口,用来允许访问者访问元素* <p>** @author ZRH* @version 1.0.0* @date 2020/7/24*/
class ObjectStructure {/*** 维护了一个集合(使用了List,当然可以是其他)*/private List<Person> persons = new LinkedList<>();/*** 增加** @param p*/public void attach(Person p) {persons.add(p);}/*** 移除** @param p*/public void detach(Person p) {persons.remove(p);}/*** 显示测评情况** @param action 动作*/public void display(Action action) {for (Person p : persons) {p.accept(action);}}
}

优点

  • 访问者模式符合单一职责原则、让程序具有优秀的扩展性、灵活性非常高
  • 访问者模式可以对功能进行统一,可以做报表、UI、拦截器与过滤器,适用于数据结构相对稳定的系统

缺点

  • 具体元素对访问者公布细节,也就是说访问者关注了其他类的内部细节,这是迪米特法则所不建议的, 这样造成了具体元素变更比较困难
  • 违背了依赖倒转原则。访问者依赖的是具体元素,而不是抽象元素

应用场景

  • 如果一个系统有比较稳定的数据结构,又有经常变化的功能需求,那么访问者模式比较合适


其他链接

【Java设计模式】简单学工厂模式

【Java设计模式】简单学抽象工厂模式

【Java设计模式】简单学建造者模式

【Java设计模式】简单学单例模式

【Java设计模式】简单学原型模式

【Java设计模式】其他模式~

【Java设计模式】简单学访问者模式——我的选择是,Yes相关推荐

  1. Java 设计模式之 Visitor 访问者模式

    Visitor 访问者模式适用的场景是,存在某个容器,里面的组成部分不会发生变化,对这些组成部分的访问,不是由这个容器决定,而是交给访问者决定. 举个生活中的例子,比如稻草人,卖包,卖鞋子这些固定的消 ...

  2. 重学 Java 设计模式:实战访问者模式「模拟家长与校长,对学生和老师的不同视角信息的访问场景」

    作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获!

  3. 【Java设计模式】简单学解释器模式——加减乘除

    目录 说明 实现方式 应用场景 其他链接 说明 行为型模式之一,其他还有命令模式.模板方法模式.访问者模式.观察者模式.中介者模式.备忘录模式.迭代器模式.状态模式.策略模式.职责链模式(责任链模式) ...

  4. 【Java设计模式】简单学外观模式——万能遥控器

    目录 说明 目标 实现方式 注意事项 其他链接 说明 结构型模式之一,其他还有适配器模式.桥接模式.组合模式.装饰模式.享元模式.代理模式 外观模式(Facade Pattern)通过定义一个一致的接 ...

  5. 【Java设计模式】简单学桥接模式——来杯大杯加奶不加糖咖啡

    目录 说明 目标 实现方式 应用场景 其他链接 说明 结构型模式之一,其他还有适配器模式.装饰模式.组合模式.外观模式.享元模式.代理模式 目标 用抽象关联取代了多层继承,将类之间的静态继承关系转换为 ...

  6. Java设计模式之责任链模式(简单易懂)

    前言: 责任链模式(Chain of Responsibility): 使多个对象都有机会处理同一请求,从而避免请求的发送者和接受者之间的耦合关系,每个对象都是一个处理节点,将这些对象连成一条链,并沿 ...

  7. 设计模式学习之访问者模式

    访问者模式,是行为型设计模式之一.访问者模式是一种将数据操作与数据结构分离的设计模式,它可以算是 23 中设计模式中最复杂的一个,但它的使用频率并不是很高,大多数情况下,你并不需要使用访问者模式,但是 ...

  8. Java设计模式(装饰者模式-组合模式-外观模式-享元模式)

    Java设计模式Ⅳ 1.装饰者模式 1.1 装饰者模式概述 1.2 代码理解 2.组合模式 2.1 组合模式概述 2.2 代码理解 3.外观模式 3.1 外观模式概述 3.2 代码理解 4.享元模式 ...

  9. java设计模式3种工厂模式

    java设计模式3种工厂模式 2010-01-08 16:06:36|  分类: JAVA技术|举报|字号 订阅 下载LOFTER客户端 工厂模式分为三种: Simple Factory模式 专门定义 ...

最新文章

  1. fiddler4 使用教程
  2. selenium找不到元素
  3. linux6添加chkconfig管理,10、14 Linux系统服务管理工具-chkconfig
  4. 《Python Cookbook 3rd》笔记(5.16):增加或改变已打开文件的编码
  5. onclick进不去ajax,在ajax调用之后处理onclick函数
  6. python文本内容怎么转换成字典_怎么把照片上的文字转换成文本?照片转换文字神器来了...
  7. 实时数据处理环境搭建flume+kafka+storm:4.storm安装配置
  8. golang log模块之log4go使用介绍
  9. 23数据错误循环冗余检查/无法读取源文件或磁盘 解决
  10. 五个维度打造研发管理体系
  11. 国家省、市、县、镇/街道地址
  12. Godaddy、Lunarpages、IXwebhosting国外三大主机点评
  13. android系统架构,文件目录
  14. Android Material Design动画 Curved motion | 曲线运动
  15. 发散性思维对养蜂技术的提高作用
  16. 《软件体系结构》 第九章 软件体系结构评估
  17. 《五子棋大师》技术支持
  18. SqlNullValueException: Data is Null. This method or property cannot be called on Null values.
  19. 基于MODIS数据的大气水汽反演
  20. 1.4 想要通过小红书赚钱,这些底层逻辑你一定要懂!【玩赚小红书】

热门文章

  1. 2018年双11预售怎么玩 如何跟上双11活动节奏
  2. 输入n行的杨辉三角java,杨辉三角 Java代码 可以根据输入 输出相应行数的杨辉三角...
  3. 飞行模式待机电流分析详解
  4. 蓝鸟中文编程2.7破解版
  5. Java+sql server学生管理系统代码展示
  6. 前端显示微信消息中的emoji表情
  7. Pusher入门:使用Channels,PHP和Vue.js构建聊天应用程序
  8. 互联网金融风控面试算法知识(一)
  9. 网络扫描,端口扫描,漏洞扫描,带你认识nmap
  10. Linux 系统 top 命令详解