- 寻找合适的对象
面向对象的程序设计由对象组成,对象Object包括数据和对数据进行操作的过程,这些个过程也常常称为方法Method。对象在收到客户的请求(或消息)后,执行相应的动作。 客户请求是使得对象执行操作的唯一途径,方法又是改变内部数据的唯一途径。由于这些限制,对象的内部状态是被封装的,对于外部对象是不可见的。面向对象设计最困难的部分是将系统分解成对象集合。因为要考虑许多因素:封装、粒度、依赖关系、灵活性、性能、演化、复用等,它们都影响着系统的分解,并且这些因素通常还是互相冲突的。 你可以写出一个问题的描述,挑出名词和动词,进而创建相应的类和方法;或者关注系统的协作和职责关系;还可以对现实世界建模,再将分析时发现的对象转化至设计中。设计模式帮你确定并不明显的抽象和描述这些抽象的对象。例如,描述算法的对象在现实中并不存在,但他们却是设计的关键部分。Strategy模式描述了怎样实现可互换的算法族。State模式将实体的每一个状态描述为一个对象。这些对象在分析阶段,甚至在设计阶段的早期并不存在,后来为了设计的灵活性,复用性才将它们发掘出来。
- 决定对象的粒度
对象在大小和数目上变化极大。它们能表示下自硬件或上自整个应用的任何事物。那么怎样决定一个对象应该是什么呢?设计模式很好地讲述了这个问题。Facade模式描述了怎样用对象表示完整的子系统,Flyweight模式描述了如何支持大量的最小粒度的对象。其他一些设计模式描述了将一个对象分解成许多小对象的特定方法。Abstract Factory和Builder模式产生那些负责生成其他对象的对象。Visitor和command模式生成的对象专门负责实现对其他对象或对象组的请求。
- 指定对象接口
对象声明的每个操作指定操作名、作为参数的对象和返回值,这就是操作的型构Signature。所有方法的集合构成了该类或对象的接口。类型是用来标识特定接口的一个名字。如果一个对象接受“Window”接口定义的所有操作请求,那么可以说该对象具有“Window”类型。一个对象可以有许多类型,并且不同的对象可以共享同一个类型。接口可以包含其他接口作为子集。当一个类型的接口包含另一个类型的接口时,我们可以说它是另一个类型的子类型SubType,另一个类型称之为它的超类型superType。我们常说子类型继承了它的超类型接口。在面向对象系统中,接口是基本的组成部分。对象只有通过他们的接口才能与外部交流,如果不通过对象的接口就无法知道对象的任何事情,也无法请求对象做任何事情。对象接口与其功能实现是分离的,不同对象可以对请求做不同的实现,也就是说,两个有相同接口的对象可以有完全不同的实现。
- 描述对象的实现
- 运用复用机制
- 关联运行时刻和编译时刻的结构
- 设计应该支持变化