《JAVA与模式》之访问者模式
在阎宏博士的《JAVA与模式》一书中开头是这样描述访问者(Visitor)模式的:
访问者模式是对象的行为模式。访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变。
1 interface Service { 2 3 public void accept(Visitor visitor); 4 } 5 6 class Visitor { 7 8 public void process(Service service) { 9 // 基本业务 10 System.out.println("基本业务"); 11 } 12 13 public void process(Saving service) { 14 // 存款 15 System.out.println("存款"); 16 } 17 18 public void process(Draw service) { 19 // 提款 20 System.out.println("提款"); 21 } 22 23 public void process(Fund service) { 24 System.out.println("基金"); 25 // 基金 26 } 27 28 } 29 30 class Saving implements Service { 31 32 public void accept(Visitor visitor) { 33 visitor.process(this); 34 35 } 36 } 37 38 class Draw implements Service { 39 40 public void accept(Visitor visitor) { 41 visitor.process(this); 42 43 } 44 } 45 46 class Fund implements Service { 47 48 public void accept(Visitor visitor) { 49 visitor.process(this); 50 51 } 52 }
从上面例子可以看出,访问者借助的是java的动态分配机制,使得visitor可以顺利的执行相应对象的方法
1 // 正常逻辑实现 2 3 Service service1 = new Saving(); 4 Service service2 = new Fund(); 5 Service service3 = new Draw(); 6 List<Service> ls = new ArrayList<Service>(); 7 ls.add(service1); 8 ls.add(service2); 9 ls.add(service3); 10 for (Service service : ls) { 11 if (service instanceof Saving) { 12 System.out.println("存款"); 13 } else if (service instanceof Fund) { 14 System.out.println("基金"); 15 } else if (service instanceof Draw) { 16 System.out.println("提款"); 17 } 18 } 19 //上述的问题是随着业务量增大 代码维护量会非常的大 需要不断的去判断 20 21 //采用访问者模式解决 22 Service saving = new Saving(); 23 Service fund = new Fund(); 24 Service draw = new Draw(); 25 Visitor visitor = new Visitor(); 26 saving.accept(visitor); 27 fund.accept(visitor); 28 draw.accept(visitor); 29 //上述中accept中实际上有观察者的影子 实际上 访问者我们也可以理解成一个对业务熟悉的观察者 30 //他不断观察者是否有新的业务需求 有的话 进行相应的业务处理
小结:
采用Visitor的好处如上面说到的那样,当需要改变其中一项业务的处理时,不需要每个地方都进行修改,而只需要改动Visitor类中相应的处理函数就可以了。也就是说它适合于业务处理时常发生变动的情况。
当然,Visitor也有它自身的限制。它不适合于业务数量的经常变化,因为一旦新增或删除一些Service时,需要对visitor进行相应的增删。也就是说具体Service与Visitor是耦合的
其实也是将责任抽象成一个个具体的类,从而避免在一个类中既处理逻辑又带有功能,违反了面向对象原则--责任单一
参考:
http://men4661273.iteye.com/blog/1635167
http://www.cnblogs.com/java-my-life/archive/2012/06/14/2545381.html
《JAVA与模式》之访问者模式相关推荐
- 图解Java设计模式学习笔记——行为型模式(模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式)
一.模板方法模式(模板模式)--钩子方法 1.需求-豆浆制作问题 编写制作豆浆的程序,说明如下: 制作豆浆的流程选材-->添加配料-->浸泡-->放到豆浆机打碎. 通过添加不同的配料 ...
- 设计模式之观察者模式、中介者模式、迭代器模式、访问者模式、备忘录模式、解释器模式
前言 这是设计模式的最后一章,包含了剩余的 行为型模式 中的 观察者模式.中介者模式.迭代器模式.访问者模式.备忘录模式.解释器模式 系列文章 第一章:7种设计原则之单一职责原则.接口隔离原则.依赖倒 ...
- 行为型模式:访问者模式
前方高能:<一故事一设计模式>PDF 电子书已经上线,关注公众号即可获取. 文章首发: 行为型模式:访问者模式 十一大行为型模式之十一:访问者模式. 简介 姓名 :访问者模式 英文名 :V ...
- 设计模式(行为型模式)——访问者模式(Visitor)
2019独角兽企业重金招聘Python工程师标准>>> 访问者模式把数据结构和作用于结构上的操作解耦合,使得操作集合可相对自由地演化.访问者模式适用于数据结构相对稳定算法又易变化的系 ...
- 行为型模式之访问者模式
行为型模式之访问者模式 定义 场景 模式结构和说明 项目介绍 设计 示例代码 模式讲解 1. 模式的功能 2. 调用通路 3. 两次分发技术 定义 表示一个作用于某对象结构中的各元素的操作.它让我们可 ...
- 桥梁模式和访问者模式
桥梁模式 将抽象部分与实现部分分离,使得他们两部分可以独立的变化. 有这样一个例子:我们希望可以在windows和Linux下都可以查看BMP.JPEG.GIF类型文件.纯粹的继承就需要2*3个子类而 ...
- 行为型模式【访问者模式】
行为型模式[访问者模式] 访问者模式是一种将数据结构与数据操作分离的设计模式.是指封装一些作用于某些数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作.属于行为型模式 ...
- 设计模式之适配器模式、委派模式、访问者模式、工厂模式、桥接模式(双维度扩展)
设计模式之适配器模式.委派模式.访问者模式.工厂模式.观察者-发布订阅模式 设计模式分类: 适配器模式(Adapter Pattern) 定义 使用场景 代码实现 写法一:类适配器 写法二:对象适配器 ...
- java的visitor模式_访问者模式Visitor
一 概述 场景:通常来说,用于封装数据所用到的pojo类,其只包含get.set,对应的业务逻辑是在Service上完成的:但如果出现多个pojo类都共用一套逻辑时,则应该考虑将逻辑进行抽象,不同类型 ...
- Java 设计模式之 Visitor 访问者模式
Visitor 访问者模式适用的场景是,存在某个容器,里面的组成部分不会发生变化,对这些组成部分的访问,不是由这个容器决定,而是交给访问者决定. 举个生活中的例子,比如稻草人,卖包,卖鞋子这些固定的消 ...
最新文章
- windows 7装IIS
- matlab仿真计算代码代写,matlab/simulink程序代写
- 原生 ajax查询,原生ajax啦啦啦
- centos安装Oracle virtual box
- Mybatis使用statementType=STATEMENT实现动态传入表名或字段名
- ArcGIS Engine 编辑- ITask
- foxmail邮箱日历怎么新建事务
- 如何让不懂信息化的甲方客户看懂需求文档,并确认签字?
- Android开发笔记(一百三十一)水波图形与水波动画
- 【结构型】Bridge模式
- 简单使用idea Spring Boot搭建项目
- HTML5七夕情人节表白网页(爱情树 Html5实现唯美表白动画代码) HTML+CSS+JavaScript
- Python项目(Django):国内新冠肺炎疫情大数据可视化平台
- 佛说五百年的回眸才换来今生的擦肩而过
- ElementUI的表格换行符失效、不换行
- 玩客云快速入门刷机相关教程
- 图片太大了怎么改小KB?教你2招无损图片压缩
- Linux配置多网口IP地址,linux配置ip 多个网口
- 小技巧: 掀开 Metacity 的同化殊效
- html如何使文本变为粗体_如何使组框的文本变为粗体而不是其中包含的控件的文本?...
热门文章
- Teamviewer连接服务器显示不能够全屏 或 向日葵连接服务器不能够全屏 或 Teamviewer只显示一个640x480的分辨率选项
- 1_CUDA编程介绍(20181121)
- abb外部轴零位校准_新品发布 | ABB机器人节拍最快的冲压自动化以及ABB紧凑型车身内喷解决方案...
- tc-core-library-js学习笔记
- xBIM WeXplorer 设置模型颜色
- Error: The 'decorators' plugin requires a 'decoratorsBeforeExport' option
- Builder建造者模式
- 《java编程思想》读后笔记:二,吸血鬼数字
- 软件测试随手记(转)
- Windows Workflow Beta2 HOL学习笔记(三):使用IfElse Activity,声明条件和自定义活动...