1. 实现

//各种客户的父类
public abstract class Customer { private String customerId;// 客户编号  private String name;    //客户名称 ...  get().set()public abstract void accept(Visitor visitor);
}//企业客户
public class EnterpriseCustomer extends Customer{    private String linkman;//联系人 private String linkTelephone;//联系电话 private String registerAddress;//企业注册地址public abstract void accept(Visitor visitor);
} //个人客户
public class PersonalCustomer extends Customer{private String telephone;     //联系电话  private int age;//年龄public void accept(Visitor visitor) {//回调访问者对象的相应方法visitor.visitPersonalCustomer(this);}
}//访问者接口
public interface Visitor {//访问企业客户,相当于给企业客户添加访问者的功能 public void visitEnterpriseCustomer(EnterpriseCustomer ec);//访问个人客户,相当于给个人客户添加访问者的功能 public void visitPersonalCustomer(PersonalCustomer pc);
}public class WorthAnalyzeVisitor implements Visitor {public void visitEnterpriseCustomer(EnterpriseCustomer ec){//根据购买的金额大小、购买的产品和服务的多少、购买的频率等进行分析//企业客户的标准会比个人客户的高System.out.println("现在对企业客户"+ec.getName()+"进行价值分析");}public void visitPersonalCustomer(PersonalCustomer pc){System.out.println("现在对个人客户"+pc.getName()+"进行价值分析");}
}public class ServiceRequestVisitor implements Visitor {public void visitEnterpriseCustomer(EnterpriseCustomer ec){//企业客户提出的具体服务请求System.out.println(ec.getName()+"企业提出服务请求");}public void visitPersonalCustomer(PersonalCustomer pc){//个人客户提出的具体服务请求System.out.println("客户"+pc.getName()+"提出服务请求");}
}
public class ObjectStructure {//要操作的客户集合 private Collection<Customer> col = new ArrayList<Customer>();//提供给客户端操作的高层接口,具体的功能由客户端传入的访问者决定 public void handleRequest(Visitor visitor){//循环对象结构中的元素,接受访问for(Customer cm : col){cm.accept(visitor);}}//组建对象结构,向对象结构中添加元素。 public void addElement(Customer ele){this.col.add(ele);}
}public static void main(String[] args) {//创建ObjectStructObjectStructure os = new ObjectStructure();//准备点测试数据,创建客户对象,并加入ObjectStructureCustomer cm1 = new EnterpriseCustomer();cm1.setName("ABC集团");os.addElement(cm1);Customer cm2 = new EnterpriseCustomer();cm2.setName("CDE公司");os.addElement(cm2);Customer cm3 = new PersonalCustomer();cm3.setName("张三");os.addElement(cm3);//客户提出服务请求,传入服务请求的VisitorServiceRequestVisitor srVisitor = new ServiceRequestVisitor();os.handleRequest(srVisitor);//要对客户进行偏好分析,传入偏好分析的VisitorPredilectionAnalyzeVisitor paVisitor = new PredilectionAnalyzeVisitor();os.handleRequest(paVisitor);//要对客户进行价值分析,传入价值分析的VisitorWorthAnalyzeVisitor waVisitor = new WorthAnalyzeVisitor();os.handleRequest(waVisitor);       }

2. 总结

1.访问者的功能

访问者模式能给一系列对象透明地添加新功能,从而避免在维护期间对这一系列对象进行修改,而且还能变相实现复用访问者所具有的功能。
由于是针对一系列对象的操作,这也导致,如果只想给一系列对象中的部分对象添加功能,就会有些麻烦;而且要始终能保证把这一系列对象都调用到,不管是循环,还是递归,总之要让每个对象都要被访问到。

2.调用通路

访问者之所以能实现“为一系列对象透明地添加新功能”,注意是透明的,也就是这一系列对象是不知道被添加功能的。
重要的就是依靠通用方法,访问者这边说要去访问,就提供一个访问的方法,如visit方法;而对象那边说,好的,我接受你的访问,提供一个接受访问的方法,如accept方法。这两个方法并不代表任何具体的功能,只是构成一个调用的通路,那么真正的功能实现在哪里呢?又如何调用到呢?
很简单,就在accept方法里面,回调visit的方法,从而回调到访问者的具体实现上,而这个访问者的具体实现的方法才是要添加的新的功

《研磨设计模式》chap25 访问者模式Visitor(2)模式应用到场景相关推荐

  1. 设计模式:访问者(Visitor)模式

    设计模式:访问者(Visitor)模式 一.前言    什么叫做访问,如果大家学过数据结构,对于这点就很清晰了,遍历就是访问的一般形式,单独读取一个元素进行相应的处理也叫作访问,读取到想要查看的内容+ ...

  2. 设计模式之访问者(visitor)模式

    在患者就医时,医生会根据病情开具处方单,很多医院都会存在以下这个流程:划价人员拿到处方单之后根据药品名称和数量计算总价,而药房工作人员根据药品名称和数量准备药品,如下图所示. 在软件开发中,有时候也需 ...

  3. 设计模式的征途—16.访问者(Visitor)模式

    在患者就医时,医生会根据病情开具处方单,很多医院都会存在以下这个流程:划价人员拿到处方单之后根据药品名称和数量计算总价,而药房工作人员根据药品名称和数量准备药品,如下图所示. 在软件开发中,有时候也需 ...

  4. 访问者(Visitor)模式

    访问者(Visitor)模式:访问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变. /* * 抽象访问者(Visitor)角色: ...

  5. 研磨设计模式 之 访问者模式(Visitor)2——跟着cc学设计系列

    25.2  解决方案 25.2.1  访问者模式来解决 用来解决上述问题的一个合理的解决方案,就是使用访问者模式.那么什么是访问者模式呢? (1)访问者模式定义 (2)应用访问者模式来解决的思路 仔细 ...

  6. 研磨设计模式学习笔记之装饰器模式

    1.装饰器模式定义:动态地给一个对象添加一些额外的功能职责,就增加功能来说,装饰器模式要比生成子类更加灵活. 2.装饰器模式实现:在装饰器模式的实现中,为了能够实现和原来使用被装饰对象的代码无缝隙结合 ...

  7. 北风设计模式课程---访问者模式(Visitor)

    北风设计模式课程---访问者模式(Visitor) 一.总结 一句话总结: 设计模式是日常问题的经验总结方案,所以学好设计模式对日常出现的问题可以有很好的解决. 访问者设计模式有点神似 抽象工厂模式, ...

  8. Java设计模式(访问者模式-迭代器模式-观察者模式-中介者模式)

    Java设计模式Ⅶ 1.访问者模式 1.1 访问者模式概述 1.2 代码理解 2.迭代器模式 2.1 迭代器模式概述 2.2 代码理解 3.观察者模式 3.1 观察者模式概述 3.2 代码理解 4.中 ...

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

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

  10. 设计模式(3)行为型模式

    行为型模式 行为模式负责对象间的高效沟通和职责委派. 行为型模式: 策略模式:将一组算法封装成一系列对象.通过传递这些对象可以灵活的改变程序的功能.比如说:java.util.Comparator#c ...

最新文章

  1. Python 写了一个网页版的「P图软件」,惊呆了!
  2. 成为计算机视觉工程师的第一个月,我都学会了什么?
  3. shell 监控局域网的主机是否up(转)
  4. 辞退了一名 2 年工作经验的前端工程师
  5. 使用socket实现信用卡程序和迷你购物商城
  6. C++ 11 笔记 (四) : std::bind
  7. 复制(主从复制、读写分离)
  8. 运用Edraw为WPF应用程序嵌入Office文档的方法总结
  9. JVM系列之:JIT中的Virtual Call接口
  10. Scala与Java差异(三)之函数
  11. 【Elasticsearch】关于 Analyzers 的一切,第一部分
  12. 号外号外:Exchange2010SP2已经发布
  13. 国家级精品课程 电子资源 网址
  14. 自己动手搭建家庭局域网(三),千兆网+NAS存储+低成本
  15. Springboot集成MybatisPlus、Druid
  16. go语言打印日期_专访Go语言布道师Dave Cheney:Go语言这十年,只能用“成功”一词总结...
  17. 数学计算机 分数乘法,分数乘法的计算方法
  18. 云平台(用户、配额管理)
  19. 《云原生入门级开发者认证》学习笔记之云原生基础设施之Kubernetes(三)
  20. 嵌入式ARM设计编程(一) 简单数据搬移

热门文章

  1. CSS之定位布局(position,relative定位布局技巧)
  2. oracle 取今日0时,Oracle 取得当天0时0分0秒和23时59分59秒
  3. php gd测试代码,PHP: GD - Manual
  4. 数据中心、智慧机房全套解决方案
  5. 继鼎晖夹层完成80亿募集后,鼎晖夹层IDC基金首轮关账15亿
  6. linux编译器6,Linux安装gcc编译器详解(CentOS 6.5 64位系统)
  7. 7000更换控制器电源步骤_恒温恒湿试验箱几大故障的检查步骤及解决方法说明...
  8. ML:MLOps系列讲解之《MLOps原则之监控/“机器学习成绩”系统/可再现性/松散耦合架构(模块化)/基于ML的软件交付指标/MLOps原则和实践的总结》解读
  9. CV:计算机视觉基础之图像存储到计算机的原理daiding
  10. DataScience:对严重不均衡数据集进行多种采样策略(随机过抽样、SMOTE过采样、SMOTETomek综合采样、改变样本权重等)简介、经验总结之详细攻略