1
面向对象软件工程实践指南
1.2.7.3 7.3 从可重用软件单元到可重用设计知识
7.3 从可重用软件单元到可重用设计知识

典型的可重用软件元素包括类库、框架、中间件,而典型的可重用软件设计知识就是设计模式。

7.3.1 类库

类库(class library)是类的集合,一般的类库用以解决一系列常见编程任务(包括诸如字符串管理、数据收集、数据库连接以及文件访问等任务),也有针对不同开发任务的类库(如语音处理、图像处理、算法等)。围绕各种程序设计语言,都有大量的类库,从而形成了一个开发语言的生态环境。可以说类库的丰富程度是决定一个语言是否得到广泛应用的重要因素。

7.3.2 软件框架

虽然通过类的重用可以提高开发效率,但是这种重用在实践中存在着一些不足:①目前的类库日趋庞大以至于使用人员难以掌握;②大多数类的粒度还太小,人们不得不将多个类的对象组合起来并作为一个整体来使用,这就使得人们逐渐追求更大规模的软件重用。

软件框架(software framework),是指为了实现某个业界标准或完成特定基本任务的软件组件规范,也指为了实现某个软件组件规范时,提供规范所要求的基础功能的软件产品,此处用的是第二个含义。

软件框架是面向某领域的、可复用的“半成品”软件,它实现了该领域的共性部分,并提供一系列定义良好的“可变点”以保证灵活性和可扩展性。

所谓软件框架中的“可变点”有以下四种情况:

(1)模板参数化:软件框架提供代码自动生成工具,该工具根据用户设置的参数自动生成所需的代码。

(2)继承和多态:通过面向对象中的子类继承和重载,在子类中加入新的功能或改变父类的行为。

(3)动态绑定:在运行时刻动态绑定所需的对象服务,这可以通过一些软件设计模式实现。

(4)构件替换:通过替换框架中可插拔的构件来加入业务特定的功能。

使用软件框架进行开发,开发者只需要关注那些需要自己实现的部分,软件框架将会主动调用用户开发的软件组件,从而实现软件的功能。

软件框架有很多种,按其应用的范围可分为:

(1)系统基础设施框架:用于简化系统级软件的开发,如操作系统、用户界面、语言处理等。开发框架的例子如struts1、struts2、hibernate、spring、ibatis、Lucene等。

(2)企业应用框架:用于各类应用领域,如电信、制造业、金融等。如Apache OFBiz就是一个较全面的企业软件框架。

7.3.3 中间件

中间件(middleware)也是可重用软件。中间件位于操作系统、网络和数据库之上,应用软件的下层,作用是为处于上层的应用软件提供运行与开发的环境,帮助用户灵活、高效地开发和集成复杂的应用软件。

中间件一般是分布式的软件,在网络通信功能的基础上,提供了应用之间的互操作能力。中间件向应用提供的服务一般具有标准的程序接口和协议,同时应该具备跨平台的能力,就是说针对不同的操作系统和硬件平台,需要有符合接口和协议规范的多种实现。

目前中间件可以分为以下类型:

1)数据库中间件

数据库中间件在所有的中间件中是应用最广泛、技术最成熟的一种。ODBC就是一种典型的、相对简单而又广泛使用的数据库中间件,它允许应用程序和本地或者异地的数据库进行通信,并提供了一系列的面向应用程序的接口API。在使用时,只要在ODBC中添加一个数据源,然后就可以直接在自己的应用程序中使用这个数据源,而不用关心目标数据库的实现原理、实现机制。

2)远程过程调用(remote procedure call,RPC)中间件

远程过程调用广泛应用于客户/服务器架构中,使得程序员就像调用本地过程一样在程序中调用远程过程,然后将运行结果返回给本地程序。远程过程调用具有跨平台性,也就是说它的调用可以跨不同操作系统平台,程序员在编程时并不需要考虑这些细节。远程过程调用采用的是同步通信方式,对于比较小型的简单应用比较适合。但是对于一些大型的应用,这种方式不一定适合,同时在一些复杂应用中,需要考虑网络或者系统故障,处理并发操作、缓冲、流量控制以及进程同步等问题,这些是远程过程调用中间件所无法满足的。

3)基于对象请求代理(objec trequest broker,ORB)的中间件

对象请求代理是与编程语言无关的面向对象的RPC应用。从管理和封装的模式上看,对象请求代理和远程过程调用类似,不过对象请求代理可以包含比远程过程调用和消息中间件更复杂的信息,并且可以适用于非结构化的或者非关系型的数据。

4)面向消息中间件(message oriented middleware,MOM)

消息中间件适用于需要在多个进程之间进行可靠的数据传送的分布式环境。

它的优点在于能够在客户和服务器之间提供同步和异步的连接,并且在任何时刻都可以将消息进行传送或者存储转发。消息中间件不会占用大量的网络带宽,可以跟踪事务,并且通过将事务存储到磁盘上实现网络故障时系统的恢复。

5)事务处理中间件(transaction processing monitor,TPM)

事务处理中间件是针对复杂环境下分布式应用的速度和可靠性要求而实现的。它给程序员提供了一个事务处理的API,程序员可以使用这个程序接口编写高速而且可靠的分布式应用程序。事务处理中间件常见的功能包括全局事务协调、事务的分布式两段提交、资源管理器支持、故障恢复、高可靠性、网络负载平衡等等。

6)服务中间件

随着Web服务技术的应用和普及,出现了针对Web服务的中间件软件,其中最具有代表性的是服务总线,它是传统中间件技术与XML、Web服务等技术结合的产物。它消除了不同应用之间的技术差异,实现了不同服务之间的通信和整合。从功能上看,服务总线提供了事件驱动的处理模式,以及分布式的运行管理机制,它支持基于内容的路由和过滤,具备了复杂数据的传输能力,并可以提供一系列的标准接口。

7.3.4 设计模式

针对特定的设计问题,人们总结了一些成功的设计方法,为大家所共享,这就是设计模式。设计模式是一个问题和方案对,即针对什么问题,提供什么方案且这个方案有何优缺点,两者都加以明确化。

设计模式有许多。我们可以把它归为三类,即结构模式、行为模式和创建模式。结构模式用来降低类之间的耦合性,通常采用引入抽象类或者接口以实现未来的可扩展性;行为模式将算法或者功能实现进行合理分配,使得整体控制流程中的某一个步骤的功能实现能够动态替换或者改变;创建模式将复杂的对象生成过程进行了抽象,使得那些需要依据外界配置条件才决定生成一组对象的操作对软件其他部分透明。

图7-1列出了按照此三种分类的常见的设计模式。

图7-1 设计模式的分类