读书人

访问者方式1

发布时间: 2013-12-06 17:56:43 作者: rapoo

访问者模式1

25.1? 场景问题

25.1.1? 扩展客户管理的功能

?????? 考虑这样一个应用:扩展客户管理的功能。

?????? 既然是扩展功能,那么肯定是已经存在一定的功能了,先看看已有的功能:公司的客户分成两大类,一类是企业客户,一类是个人客户,现有的功能非常简单,就是能让客户提出服务申请。目前的程序结构如图25.1所示:

?访问者方式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? 有何问题

?????? 以很简单的方式,实现了要求的功能,这种实现有没有什么问题呢?仔细分析上面的实现,发现有两个主要的问题:

  • 在企业客户和个人客户的类里面,都分别实现了提出服务请求、进行产品偏好分析、进行客户价值分析等功能,也就是说,这些功能的实现代码是混杂在同一个类里面的;而且相同的功能分散到了不同的类中去实现,这会导致整个系统难以理解、难以维护。
  • 更为痛苦的是,采用这样的实现方式,如果要给客户扩展新的功能,比如前面提到的针对不同的客户进行需求调查;针对不同的客户进行满意度分析;客户消费预期分析等等。每次扩展,都需要改动企业客户的类和个人客户的类,当然也可以通过为它们扩展子类的方式,但是这样可能会造成过多的对象层次。

    那么有没有办法,能够在不改变客户这个对象结构中各元素类的前提下,为这些类定义新的功能?也就是要求不改变企业客户和个人客户类,就能为企业客户和个人客户类定义新的功能?