在阎宏博士的《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与模式》之访问者模式相关推荐

  1. 图解Java设计模式学习笔记——行为型模式(模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式)

    一.模板方法模式(模板模式)--钩子方法 1.需求-豆浆制作问题 编写制作豆浆的程序,说明如下: 制作豆浆的流程选材-->添加配料-->浸泡-->放到豆浆机打碎. 通过添加不同的配料 ...

  2. 设计模式之观察者模式、中介者模式、迭代器模式、访问者模式、备忘录模式、解释器模式

    前言 这是设计模式的最后一章,包含了剩余的 行为型模式 中的 观察者模式.中介者模式.迭代器模式.访问者模式.备忘录模式.解释器模式 系列文章 第一章:7种设计原则之单一职责原则.接口隔离原则.依赖倒 ...

  3. 行为型模式:访问者模式

    前方高能:<一故事一设计模式>PDF 电子书已经上线,关注公众号即可获取. 文章首发: 行为型模式:访问者模式 十一大行为型模式之十一:访问者模式. 简介 姓名 :访问者模式 英文名 :V ...

  4. 设计模式(行为型模式)——访问者模式(Visitor)

    2019独角兽企业重金招聘Python工程师标准>>> 访问者模式把数据结构和作用于结构上的操作解耦合,使得操作集合可相对自由地演化.访问者模式适用于数据结构相对稳定算法又易变化的系 ...

  5. 行为型模式之访问者模式

    行为型模式之访问者模式 定义 场景 模式结构和说明 项目介绍 设计 示例代码 模式讲解 1. 模式的功能 2. 调用通路 3. 两次分发技术 定义 表示一个作用于某对象结构中的各元素的操作.它让我们可 ...

  6. 桥梁模式和访问者模式

    桥梁模式 将抽象部分与实现部分分离,使得他们两部分可以独立的变化. 有这样一个例子:我们希望可以在windows和Linux下都可以查看BMP.JPEG.GIF类型文件.纯粹的继承就需要2*3个子类而 ...

  7. 行为型模式【访问者模式】

    行为型模式[访问者模式] 访问者模式是一种将数据结构与数据操作分离的设计模式.是指封装一些作用于某些数据结构中的各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作.属于行为型模式 ...

  8. 设计模式之适配器模式、委派模式、访问者模式、工厂模式、桥接模式(双维度扩展)

    设计模式之适配器模式.委派模式.访问者模式.工厂模式.观察者-发布订阅模式 设计模式分类: 适配器模式(Adapter Pattern) 定义 使用场景 代码实现 写法一:类适配器 写法二:对象适配器 ...

  9. java的visitor模式_访问者模式Visitor

    一 概述 场景:通常来说,用于封装数据所用到的pojo类,其只包含get.set,对应的业务逻辑是在Service上完成的:但如果出现多个pojo类都共用一套逻辑时,则应该考虑将逻辑进行抽象,不同类型 ...

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

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

最新文章

  1. windows 7装IIS
  2. matlab仿真计算代码代写,matlab/simulink程序代写
  3. 原生 ajax查询,原生ajax啦啦啦
  4. centos安装Oracle virtual box
  5. Mybatis使用statementType=STATEMENT实现动态传入表名或字段名
  6. ArcGIS Engine 编辑- ITask
  7. foxmail邮箱日历怎么新建事务
  8. 如何让不懂信息化的甲方客户看懂需求文档,并确认签字?
  9. Android开发笔记(一百三十一)水波图形与水波动画
  10. 【结构型】Bridge模式
  11. 简单使用idea Spring Boot搭建项目
  12. HTML5七夕情人节表白网页(爱情树 Html5实现唯美表白动画代码) HTML+CSS+JavaScript
  13. Python项目(Django):国内新冠肺炎疫情大数据可视化平台
  14. 佛说五百年的回眸才换来今生的擦肩而过
  15. ElementUI的表格换行符失效、不换行
  16. 玩客云快速入门刷机相关教程
  17. 图片太大了怎么改小KB?教你2招无损图片压缩
  18. Linux配置多网口IP地址,linux配置ip 多个网口
  19. 小技巧: 掀开 Metacity 的同化殊效
  20. html如何使文本变为粗体_如何使组框的文本变为粗体而不是其中包含的控件的文本?...

热门文章

  1. Teamviewer连接服务器显示不能够全屏 或 向日葵连接服务器不能够全屏 或 Teamviewer只显示一个640x480的分辨率选项
  2. 1_CUDA编程介绍(20181121)
  3. abb外部轴零位校准_新品发布 | ABB机器人节拍最快的冲压自动化以及ABB紧凑型车身内喷解决方案...
  4. tc-core-library-js学习笔记
  5. xBIM WeXplorer 设置模型颜色
  6. Error: The 'decorators' plugin requires a 'decoratorsBeforeExport' option
  7. Builder建造者模式
  8. 《java编程思想》读后笔记:二,吸血鬼数字
  9. 软件测试随手记(转)
  10. Windows Workflow Beta2 HOL学习笔记(三):使用IfElse Activity,声明条件和自定义活动...