如何设计可复用的面向对象软件。必须要找到相关的对象,以适当的粒度将它们归类,再定义类的接口和继承层次,建立对象之间的基本关系。你的设计应该对手头的问题有针对性,同时对将来的问题和需求也要有足够的通用性。每一个设计模式系统的命名、解释和评价了面向对象系统中一个重要的和重复出现的设计。设计模式使人们可以更加简单方便的复用成功的设计和体系结构。
每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样你就可以一次又一次的使用该解决方案而不做重复性的劳动。设计模式有四个基本要素:模式名称、问题、解决方案、效果。
按照模式的目的性准则,模式可以分为创建型模式、结构型模式和行为型模式。创建型模式与对象的创建有关;结构型模式处理类和对象的组合;行为型模式对类和对象怎样交互和怎样分配职责进行描述。
按照模式的范围准则,模式可以分为类模式和对象模式。类模式处理类和子类的关系,这些关系通过继承建立,是静态的,在编译时就确定下来。对象模式是处理对象之间的关系,这些关系在运行时刻是可以变化的,更具动态性。
创建型类模式将对象的创建工作部分延迟到子类。创建型对象模式则是将它延迟到另一个对象中。
结构型类模式使用继承机制来组合类。结构型对象模式则描述了对象的组装方式。
行为型类模式使用继承描述算法和控制流。行为型对象模式描述使用一组对象怎样协作完成单个对象无法完成的任务。
设计模式采用多种方法解决面向对象设计者经常碰到的问题。下面给出怎样使用设计模式。
1、寻找合适的对象。面向对象的程序由对象组成,对象包括数据以及对数据进行的操作。对象在收到客户的请求后,执行相应的操作。面向对象设计最困难的地方是把系统分解成对象集合。一般的方法是写出一个问题的描述,挑出名词和动词,进而创建相应的类和操作。
2、决定对象的粒度。我们可以根据需要把一个大的对象,分解成许多小粒度的对象。
3、指定对象的接口。对象操作的型构,是指为对象声明的每一个操作指定操作名、作为参数的对象和返回值。所有对象型构的集合称为接口。对象接口描述了该对象所能接受的全部请求的集合,任何匹配对象接口的请求都可以发送给该对象。类型是用来标识特定接口的一个名字。在面向对象系统中,接口是基本的组成部分。对象只有通过它们的接口才能与外部联系。但是,对象接口与其功能实现是分离的,也就是说两个相同接口的对象可以有完全不一样的实现。
4、描述对象的实现。对象的创建是通过类来决定的。类指定了对象的内部数据和操作。理解对象的类和对象的类型之间的差别非常重要。一个对象的类定义了对象是怎样实现的,但对象类型则描述了对象所能接受的所有客户请求。同时还要区分类继承和接口继承,类继承根据一个对象的实现来定义另一个类的实现。而接口继承则是描述了一个对象什么时候能被用来替代另一个对象。可复用的面向对象设计要遵循如下原则:针对接口编程,而不是针对实现编程。不将变量声明为某个特定的具体类的实例对象,而是让它遵从抽象类所定义的接口。这样做有两个好处。一是,客户无须知道他们使用对象的特定类型,只需知道对象有客户所期望的接口。二是,客户无须知道他们使用的对象是用什么类来实现的,只需知道定义接口的抽象类。
5、运用复用机制。面向对象系统中功能复用的两种最常用技术是类继承和对象组合。类继承是指要产生的类是通过其它类来产生的。这种生成子类的复用称为白箱复用,在生成过程中父类的内部细节对子类是完全可见的。对象组合是指新的功能是通过组装和组合对象来获得。这种复用成为黑箱复用。面向对象设计的第二原则是:优先使用对象组合,而不是类继承。委托是一种组合方法,它使组合具有与继承同样的复用能力。在委托方式下,有两个对象参与处理一个请求,接受请求的对象将操作委托给它的代理者。委托是对象组合的特例,它告诉你对象组合作为一个代码复用机制可以替代继承。
6、关联运行时刻和编译时刻的结构。一个面向对象系统运行时刻的结构与它的代码结构相差较大。代码结构在编译时刻就被确定下来了,它由继承关系固定的类组成。运行时刻的结构是由快速变化的通信对象网络组成。聚合意味着一个对象拥有另一个对象,也就意味着它们具有相同的生命周期。相识意味着一个对象仅仅知道另一个对象的类型。
7、设计应支持变化。一个健壮的系统,在设计时一定要考虑,在其生命周期内会发生怎样的变化。