【Java设计模式】简单学访问者模式——我的选择是,Yes
目录
说明
实现方式
优点
缺点
应用场景
其他链接
说明
- 行为型模式之一,其他还有命令模式、模板方法模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(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相关推荐
- Java 设计模式之 Visitor 访问者模式
Visitor 访问者模式适用的场景是,存在某个容器,里面的组成部分不会发生变化,对这些组成部分的访问,不是由这个容器决定,而是交给访问者决定. 举个生活中的例子,比如稻草人,卖包,卖鞋子这些固定的消 ...
- 重学 Java 设计模式:实战访问者模式「模拟家长与校长,对学生和老师的不同视角信息的访问场景」
作者:小傅哥 博客:https://bugstack.cn - 原创系列专题文章 沉淀.分享.成长,让自己和他人都能有所收获!
- 【Java设计模式】简单学解释器模式——加减乘除
目录 说明 实现方式 应用场景 其他链接 说明 行为型模式之一,其他还有命令模式.模板方法模式.访问者模式.观察者模式.中介者模式.备忘录模式.迭代器模式.状态模式.策略模式.职责链模式(责任链模式) ...
- 【Java设计模式】简单学外观模式——万能遥控器
目录 说明 目标 实现方式 注意事项 其他链接 说明 结构型模式之一,其他还有适配器模式.桥接模式.组合模式.装饰模式.享元模式.代理模式 外观模式(Facade Pattern)通过定义一个一致的接 ...
- 【Java设计模式】简单学桥接模式——来杯大杯加奶不加糖咖啡
目录 说明 目标 实现方式 应用场景 其他链接 说明 结构型模式之一,其他还有适配器模式.装饰模式.组合模式.外观模式.享元模式.代理模式 目标 用抽象关联取代了多层继承,将类之间的静态继承关系转换为 ...
- Java设计模式之责任链模式(简单易懂)
前言: 责任链模式(Chain of Responsibility): 使多个对象都有机会处理同一请求,从而避免请求的发送者和接受者之间的耦合关系,每个对象都是一个处理节点,将这些对象连成一条链,并沿 ...
- 设计模式学习之访问者模式
访问者模式,是行为型设计模式之一.访问者模式是一种将数据操作与数据结构分离的设计模式,它可以算是 23 中设计模式中最复杂的一个,但它的使用频率并不是很高,大多数情况下,你并不需要使用访问者模式,但是 ...
- Java设计模式(装饰者模式-组合模式-外观模式-享元模式)
Java设计模式Ⅳ 1.装饰者模式 1.1 装饰者模式概述 1.2 代码理解 2.组合模式 2.1 组合模式概述 2.2 代码理解 3.外观模式 3.1 外观模式概述 3.2 代码理解 4.享元模式 ...
- java设计模式3种工厂模式
java设计模式3种工厂模式 2010-01-08 16:06:36| 分类: JAVA技术|举报|字号 订阅 下载LOFTER客户端 工厂模式分为三种: Simple Factory模式 专门定义 ...
最新文章
- fiddler4 使用教程
- selenium找不到元素
- linux6添加chkconfig管理,10、14 Linux系统服务管理工具-chkconfig
- 《Python Cookbook 3rd》笔记(5.16):增加或改变已打开文件的编码
- onclick进不去ajax,在ajax调用之后处理onclick函数
- python文本内容怎么转换成字典_怎么把照片上的文字转换成文本?照片转换文字神器来了...
- 实时数据处理环境搭建flume+kafka+storm:4.storm安装配置
- golang log模块之log4go使用介绍
- 23数据错误循环冗余检查/无法读取源文件或磁盘 解决
- 五个维度打造研发管理体系
- 国家省、市、县、镇/街道地址
- Godaddy、Lunarpages、IXwebhosting国外三大主机点评
- android系统架构,文件目录
- Android Material Design动画 Curved motion | 曲线运动
- 发散性思维对养蜂技术的提高作用
- 《软件体系结构》 第九章 软件体系结构评估
- 《五子棋大师》技术支持
- SqlNullValueException: Data is Null. This method or property cannot be called on Null values.
- 基于MODIS数据的大气水汽反演
- 1.4 想要通过小红书赚钱,这些底层逻辑你一定要懂!【玩赚小红书】