在实际开发中,针对研发的各个岗位,设计模式都是很重要的,降低耦合、可复用性、可扩展性、可维护性等等,早已是众所周知的特征。
工作越久对设计模式的期待也就越大,也就成为我必须认真对待的原因,重新认识一遍设计模式
一、面向对象类关系
就Java而言,常用来描述类关系的包含多种,其中is-a、has-a和like-a是非常普及的,面向对象的设计关系主要体现的类关系上,依靠接口、抽象类、类以及变量来描绘。
is-a
- is-a描述的是继承/泛化关系,类A is a 类B,表示A完全继承了B的属性及行为,即B是A的父类。A继承于B,B是A的泛化。
- 举例:笔记本、台式机、工作站都属于计算机,老板、员工、学生、老师都属于人。
has-a
- has-a描述的是从属关系,类A has a 类B,表示B是A的一种属性或行为,从而说明B属于A,或者说B是A的组成部分。
- 举例:操作系统是计算机的一部分,无论是winodw或Linux;大脑是人体的一部分。
- has-a是整体和部分的结合,从这方面说整体和部分的依赖,也可以分为强依赖、弱依赖等。
like-a
- like-a描述的是组合关系,类A like 类B,表示A拥有B的属性及行为的同时还具备其他能力,比如手机具有相机的功能,但同时具备通讯功能。
- 从语言上来说,A是多种接口的共同体,即A实现了多个接口。
- 举例:手机具备通讯、计算机、拍照、摄像等能力。
use-a
- use-a通常被描述为依赖关系,类A use-a 类B,表示A需要使用到B的某种或多种属性或行为,即A依赖了B对象,但这种依赖是一种比较弱的关系。
- 从语言上说类A的一个属性引用了类B
- 举例:程序员需要使用计算机编程;司机需要驾驶卡车运货。
二、UML类图关系
在实际绘制类图的过程中,类与类的关系是重点。类的关系有继承关系(Inheritance)、实现关系(Realization)、依赖关系(Dependency)和关联关系(Association),其中关联关系又可以扩展出聚合关系(Aggregation)、组合关系(Composition)。
泛化关系(Generalization)实际只是继承关系的相反的描述。
继承(Inheritance)
- 一个类A继承另外一个类B,类A为子类,类B为父类或基类,类A完全拥有类B的属性及行为,又特化了类B的所有属性、行为。
- 在Java语言中,extends关键字标识了继承关系。
实现(Realization)
- 一个类A实现一个(或多个)接口的功能。
- 在Java语言中,implements关键字标识了实现关系。
依赖(Dependency)
- 一个类A依赖另外一个类B,即类A在行为上需要使用到类B来实现自己的功能,需要依赖关系是一种弱关系,但类B的改变会影响到类A。
- 在Java语言中,依赖表现为类A的方法中使用到类B,类B是作为形参出现。
关联(Association)
- 关联关系是一种强依赖,一个类A关联了另一个类B,即类B作为属性被引用到类A中。关联可以是单向也可以是双向的,即B可以引用A也可以被A引用。
- 关联关系又分为一般关联、聚合关联和组合关联。
- 在Java语言中,关联通常使用类的属性表达,即类B作为类A的属性形式。
聚合(Aggregation)
- 聚合关系是关联关系的一种特例,充分体现了整体和部分的关系,即has-a的关系。聚合关系中的整体和部分是可以分离的,具备一定的独立性和各自的生命周期。
- 既然聚合是关联的一种特例,从现实中举例说明,类似公司和员工的关系。
组合(Composition)
- 组合关系是一种更强的聚合,或者说是包含,即contains-a的关系。
- 在组合关系中,部分不能脱离整体而独立存在,例如动物与大脑的关系,公司与部门的关系。
三、UML类图元素
在大多数绘制UML类图的工具中,都提供好了绘制的形状,简述一下关系线的表现形式。
-
继承
-
实现
-
依赖
-
关联
-
聚合
-
组合