《研磨设计模式》chap25 访问者模式Visitor(2)模式应用到场景
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)模式应用到场景相关推荐
- 设计模式:访问者(Visitor)模式
设计模式:访问者(Visitor)模式 一.前言 什么叫做访问,如果大家学过数据结构,对于这点就很清晰了,遍历就是访问的一般形式,单独读取一个元素进行相应的处理也叫作访问,读取到想要查看的内容+ ...
- 设计模式之访问者(visitor)模式
在患者就医时,医生会根据病情开具处方单,很多医院都会存在以下这个流程:划价人员拿到处方单之后根据药品名称和数量计算总价,而药房工作人员根据药品名称和数量准备药品,如下图所示. 在软件开发中,有时候也需 ...
- 设计模式的征途—16.访问者(Visitor)模式
在患者就医时,医生会根据病情开具处方单,很多医院都会存在以下这个流程:划价人员拿到处方单之后根据药品名称和数量计算总价,而药房工作人员根据药品名称和数量准备药品,如下图所示. 在软件开发中,有时候也需 ...
- 访问者(Visitor)模式
访问者(Visitor)模式:访问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变. /* * 抽象访问者(Visitor)角色: ...
- 研磨设计模式 之 访问者模式(Visitor)2——跟着cc学设计系列
25.2 解决方案 25.2.1 访问者模式来解决 用来解决上述问题的一个合理的解决方案,就是使用访问者模式.那么什么是访问者模式呢? (1)访问者模式定义 (2)应用访问者模式来解决的思路 仔细 ...
- 研磨设计模式学习笔记之装饰器模式
1.装饰器模式定义:动态地给一个对象添加一些额外的功能职责,就增加功能来说,装饰器模式要比生成子类更加灵活. 2.装饰器模式实现:在装饰器模式的实现中,为了能够实现和原来使用被装饰对象的代码无缝隙结合 ...
- 北风设计模式课程---访问者模式(Visitor)
北风设计模式课程---访问者模式(Visitor) 一.总结 一句话总结: 设计模式是日常问题的经验总结方案,所以学好设计模式对日常出现的问题可以有很好的解决. 访问者设计模式有点神似 抽象工厂模式, ...
- Java设计模式(访问者模式-迭代器模式-观察者模式-中介者模式)
Java设计模式Ⅶ 1.访问者模式 1.1 访问者模式概述 1.2 代码理解 2.迭代器模式 2.1 迭代器模式概述 2.2 代码理解 3.观察者模式 3.1 观察者模式概述 3.2 代码理解 4.中 ...
- 设计模式之观察者模式、中介者模式、迭代器模式、访问者模式、备忘录模式、解释器模式
前言 这是设计模式的最后一章,包含了剩余的 行为型模式 中的 观察者模式.中介者模式.迭代器模式.访问者模式.备忘录模式.解释器模式 系列文章 第一章:7种设计原则之单一职责原则.接口隔离原则.依赖倒 ...
- 设计模式(3)行为型模式
行为型模式 行为模式负责对象间的高效沟通和职责委派. 行为型模式: 策略模式:将一组算法封装成一系列对象.通过传递这些对象可以灵活的改变程序的功能.比如说:java.util.Comparator#c ...
最新文章
- Python 写了一个网页版的「P图软件」,惊呆了!
- 成为计算机视觉工程师的第一个月,我都学会了什么?
- shell 监控局域网的主机是否up(转)
- 辞退了一名 2 年工作经验的前端工程师
- 使用socket实现信用卡程序和迷你购物商城
- C++ 11 笔记 (四) : std::bind
- 复制(主从复制、读写分离)
- 运用Edraw为WPF应用程序嵌入Office文档的方法总结
- JVM系列之:JIT中的Virtual Call接口
- Scala与Java差异(三)之函数
- 【Elasticsearch】关于 Analyzers 的一切,第一部分
- 号外号外:Exchange2010SP2已经发布
- 国家级精品课程 电子资源 网址
- 自己动手搭建家庭局域网(三),千兆网+NAS存储+低成本
- Springboot集成MybatisPlus、Druid
- go语言打印日期_专访Go语言布道师Dave Cheney:Go语言这十年,只能用“成功”一词总结...
- 数学计算机 分数乘法,分数乘法的计算方法
- 云平台(用户、配额管理)
- 《云原生入门级开发者认证》学习笔记之云原生基础设施之Kubernetes(三)
- 嵌入式ARM设计编程(一) 简单数据搬移
热门文章
- CSS之定位布局(position,relative定位布局技巧)
- oracle 取今日0时,Oracle 取得当天0时0分0秒和23时59分59秒
- php gd测试代码,PHP: GD - Manual
- 数据中心、智慧机房全套解决方案
- 继鼎晖夹层完成80亿募集后,鼎晖夹层IDC基金首轮关账15亿
- linux编译器6,Linux安装gcc编译器详解(CentOS 6.5 64位系统)
- 7000更换控制器电源步骤_恒温恒湿试验箱几大故障的检查步骤及解决方法说明...
- ML:MLOps系列讲解之《MLOps原则之监控/“机器学习成绩”系统/可再现性/松散耦合架构(模块化)/基于ML的软件交付指标/MLOps原则和实践的总结》解读
- CV:计算机视觉基础之图像存储到计算机的原理daiding
- DataScience:对严重不均衡数据集进行多种采样策略(随机过抽样、SMOTE过采样、SMOTETomek综合采样、改变样本权重等)简介、经验总结之详细攻略