对象与模型:
有两种类型的模型:现实模型与抽象模型。现实模型与物理世界具有很强的对应性,抽象模型则是在现实模型的基础上,根据相似度、组合关系等对现实模型地进一步处理后获得的模型。
现实模型的获取可以通过ER模型或者对象模型建模得到。
在现实模型的基础上,通过分析对象间相似的成分,可以构造出更抽象的抽象模型。抽象模型中的对象可以通过继承、组合等方式生成为现实模型中的对象。如果说,现实模型是对物理世界的抽象,则抽象模型则是对现实模型的抽象。现实模型可以直接反应物理世界,抽象模型可以直接反应现实模型,而抽象模型却无法直接反应物理世界,只能通过显示模型这个关卡间接反应物理世界。
设计模式就是试图告诉我们要如何做出一个好的抽象模型。
对象的职能与规模
整个物理世界是一个大的系统,从人的观念上来看,系统是有一系列的对象组成。对象之间各司其职,通过组合构成一个更大的子系统,通过通信进行子系统间地相互协作,由此,构成了系统的运行。对象是有不同的职能的,有的对象负责对整个子系统的消息进行中转,有些对象负责具体底层工作,不一而足。
设计模式就是试图阐明如何更好地设定对象的只能及设定对象的规模。
型构/接口/类型/类型继承
现实模型中有一些对象具有相同的属性、方法,对消息的响应方式是一样的。但是,客户端对这些对象的调用时机是不同的。具备相同的属性、方法、接口的对象称为具备相同的型构,也成为具备相同的类型。显然,类型是对对象的一种抽象,这种抽象机制使得,允许一种类型对应于多个对象。通过类型定义的对象称之为类型的一个实例,创建过程称之为实例化。
类型是可以进一步抽象的,即可以通过增减方式,改变类型,常见的增减方式就是组合以及继承。通过对一个类型进行增操作,获得的一个新的类型的过程,称之为类型继承。
在抽象模型部分,通过类型间的运算,可以构成一系列新的类型的类,而这些新类又可以实例化很多的对象,其中,有很多可能无法与物理世界相对应的,但是,必须满足现实模型要求的对象。
接口与实现
对象的接口与实现相分离。这样,同样的接口将对应着不同的实现。接口要求保持相对稳定,而实现则可以灵活变动。接口与实现的关系,引申出OO当中的很多问题,包括动态绑定与多态,抽象类等等。
设计模式要求我们,对接口编程而不是对实现编程。
类继承与接口继承
类继承是通过类型运算实现的,实行了派生类与原生类的数据共享及方法共享,属于一种共享机制。
接口继承也是通过类型运算实现的,不过,就功能而言,接口继承主要提供了对于同样一个接口,拥有对不同对象的选择及替代机制。
继承与组合
继承与组合都是一种代码复用机制。但是,组合比继承要灵活。代理是组合是组合的一种形式,可以实现与继承同样的功能。
设计模式建议尽可能多使用组合,而不是继承。
CT/RT
CT是编译时的缩写,RT是运行时的缩写。CT表示了对象的静态结构,而RT则表示了对象的动态结构。很多在CT很相似的对象,在RT中却呈现出很大的不同,聚合与相识就是其中一个例子。在CT,聚合与相识均为一个对象,但在RT,聚合表现出更强的耦合性,表现为一个对象对另一个对象的生死操作,而相识的耦合性则很弱,表现为可能仅仅只是一次消息通知操作。