访问者模式1
?????? 考虑这样一个应用:扩展客户管理的功能。
?????? 既然是扩展功能,那么肯定是已经存在一定的功能了,先看看已有的功能:公司的客户分成两大类,一类是企业客户,一类是个人客户,现有的功能非常简单,就是能让客户提出服务申请。目前的程序结构如图25.1所示:
?
图25.1? 已有的客户管理程序结构示意图
现有的实现很简单,先看看Customer的实现,示例代码如下:
/**
?* 各种客户的父类
?*/
public /** ?* 企业客户 ?*/ public??? ? ? ? ??? /** ??? ?* 企业客户提出服务请求的方法,示意一下 ??? ?*/ ??? public void serviceRequest(){ ?????? //企业客户提出的具体服务请求 ?????? System.out.println(this.getName()+"企业提出服务请求"); ??? } } 再看看个人客户的实现示例代码如下: /** ?* 个人客户 ?*/ public 图25.2? 扩展客户管理功能的结构示意图 ?????? 按照这个思路,把程序示意实现出来,示例如下。 (1)先看看抽象的父类,主要就是加入了两个新的方法,示例代码如下: public abstract class Customer { ??? private String customerId; ??? private String name; ? ? ? ? ??? public abstract void serviceRequest(); ? ??? /** ??? ?* 客户对公司产品的偏好分析,示意一下 ??? ?*/ ??? public abstract void predilectionAnalyze(); ??? /** ??? ?* 客户价值分析,示意一下 ??? ?*/ ??? public abstract void worthAnalyze(); } (2)接下来看看企业客户的示意实现,示例代码如下: public class EnterpriseCustomer extends Customer{ ??? private String linkman; ??? private String linkTelephone; ??? private String registerAddress; ? ? ? ? ??? public void serviceRequest(){ ?????? //企业客户提出的具体服务请求 ?????? System.out.println(this.getName()+"企业提出服务请求"); ??? } ? ??? /** ??? ?* 企业客户对公司产品的偏好分析,示意一下 ??? ?*/ ??? public void predilectionAnalyze(){ ?????? //根据过往购买的历史、潜在购买意向 ?????? //以及客户所在行业的发展趋势、客户的发展预期等的分析 ?????? System.out.println("现在对企业客户"+this.getName() +"进行产品偏好分析"); ??? } ? ??? /** ??? ?* 企业客户价值分析,示意一下 ??? ?*/ ??? public void worthAnalyze(){ ?????? //根据购买的金额大小、购买的产品和服务的多少、购买的频率等进行分析 ?????? //企业客户的标准会比个人客户的高 ?????? System.out.println("现在对企业客户"+this.getName() +"进行价值分析"); ??? } } (3)接下来看看个人客户的示意实现,示例代码如下: public class PersonalCustomer extends Customer{ ??? private String telephone; ??? private int age; ??? ??? ? ? ??? public void serviceRequest(){ ?????? //个人客户提出的具体服务请求 ?????? System.out.println("客户"+this.getName()+"提出服务请求"); ??? } ? ??? /** ??? ?* 个人客户对公司产品的偏好分析,示意一下 ??? ?*/ ??? public void predilectionAnalyze(){ ?????? System.out.println("现在对个人客户"+this.getName() +"进行产品偏好分析"); ??? } ? ??? /** ??? ?* 个人客户价值分析,示意一下 ??? ?*/ ??? public void worthAnalyze(){ ?????? System.out.println("现在对个人客户"+this.getName() +"进行价值分析"); ??? } } (4)如何使用上面实现的功能呢,写个客户端来测试一下,示例代码如下: public class Client { ??? public static void main(String[] args) { ?????? //准备点测试数据 ?????? Collection<Customer> colCustomer = 现在对企业客户ABC集团进行产品偏好分析 现在对企业客户ABC集团进行价值分析 现在对企业客户CDE公司进行产品偏好分析 现在对企业客户CDE公司进行价值分析 现在对个人客户张三进行产品偏好分析 现在对个人客户张三进行价值分析 ?????? 以很简单的方式,实现了要求的功能,这种实现有没有什么问题呢?仔细分析上面的实现,发现有两个主要的问题: 那么有没有办法,能够在不改变客户这个对象结构中各元素类的前提下,为这些类定义新的功能?也就是要求不改变企业客户和个人客户类,就能为企业客户和个人客户类定义新的功能?25.1.3? 有何问题