25.1 场 景 问 题

25.1.1 扩展客户管理的功能

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

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

图片

图25.1 已有的客户管理程序结构示意图

现有的实现很简单,先看看Customer的实现。示例代码如下:

ce4741f9ef2b4dd88c5c996a777156bf

8a962ea303d146d6a345185bd73a5f09

接下来看看企业客户的实现。示例代码如下:

0878278bde2745dc80cf7ba1b92529d1

再来看看个人客户的实现。示例代码如下:

a3b94991371d4559b73a934194d6370e

34d8f20572b04ce3ba7d7a1bc5061d17

从上面的实现可以看出来,以前对客户的管理功能是很少的,现在随着业务的发展,需要加强对客户管理的功能。假设现在需要增加以下功能。

■ 客户对公司产品的偏好分析。针对企业客户和个人客户有不同的分析策略,主要是根据以往购买的历史、潜在购买意向等进行分析,对于企业客户还要添加上客户所在行业的发展趋势、客户的发展预期等分析。

■ 客户价值分析。针对企业客户和个人客户,有不同的分析方式和策略。主要是根据购买的金额大小、购买的产品和服务的多少、购买的频率等进行分析。

其实除了这些功能,还有很多潜在的功能,只是现在还没有要求实现,比如,针对不同的客户进行需求调查;针对不同的客户进行满意度分析;客户消费预期分析等。虽然现在没有要求实现,但不排除今后有可能会要求实现。

25.1.2 不用模式的解决方案

要实现上面要求的功能,也不是很困难,一个很基本的思路就是,既然不同类型的客户操作是不同的,那么在不同类型的客户中分别实现这些功能就可以了。

由于这些功能的实现依附于很多其他功能的实现,或者是需要很多其他的业务数据,在示例中不太好完整地体现其功能实现,都是示意一下,因此提前说明一下。

按照上述的想法,这个时候的程序结构如图25.2所示。

图片

图25.2 扩展客户管理功能的结构示意图

按照这个思路,把程序示意实现出来。

(1)先看看抽象的父类,主要就是加入了两个新的方法。示例代码如下:

e55993693b2f45aa8ccc436c4d9340b5

(2)再来看看企业客户的示意实现。

b66f980408e24fbea824020ac8740fe9

deb702f088e3458d9c88b93f52178f68

(3)接下来看看个人客户的示意实现。示例代码如下:

4b65cb09eed14faea59f44321c84536c

368cdf506c234d0faa5089b5abb887b3

(4)如何使用上面实现的功能呢?写个客户端来测试一下。示例代码如下:

c66e681e5eff4672b7dd035deea469a0

e580f76d41bc4dfab8ea92087217e263

运行结果如下:

6658e502b2ee44e482cef77d281aa891

25.1.3 有何问题

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

■ 在企业客户和个人客户的类中,都分别实现了提出服务请求、进行产品偏好分析、进行客户价值分析等功能,也就是说,这些功能的实现代码是混杂在同一个类中的;而且相同的功能分散到了不同的类中去实现,会导致整个系统难以理解、难以维护。

■ 更为痛苦的是,采用这样的实现方式,如果要给客户扩展新的功能,比如前面提到的针对不同的客户进行需求调查、针对不同的客户进行满意度分析、客户消费预期分析等。每次扩展,都需要改动企业客户的类和个人客户的类,当然也可以通过为它们扩展子类的方式,但是这样可能会造成过多的对象层次。

问题

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