设计模式之类的关系表示
面向对象的设计模式中,类间的关系主要有如下几种:(Dependence)、关联(Association)、聚合(Aggregation)、组合(Composition)、泛化/继承(Generalization/Inheritance)和实现(Implementation/Realization),它们的耦合度依次增强。
1.依赖(Dependence)
一种use - a关系,即B的对象作为A类的方法形参存在。
具体表现形式包括:局部变量、方法的参数(类A的某个方法中将类B作为参数)、静态方法的调用。
此种关系是临时的,偶然的,脆弱的。(方法调用完成后关系消失)
UML表示为: 带箭头的虚线,指向被使用者(被依赖者)
2.关联(Association)
一种has - a关系,即类D对象作为类C的属性存在。
关联分为单向关联和双向关联,单向关联即类C使用了类D,双向关联即类C和类D使用了彼此。(双向关联时箭头可隐去)
具体表现形式为:对象作为另一个类的成员变量。此种关系是持续的,长期的,固定的。(当类C对象被销毁,所关联的D对象也被销毁)
c++中另一种实现has - a 的方式为私有继承。
UML表示为: 带普通箭头的实线,指向被拥有者
3.聚合(Aggregation)
一种整体 - 个体关系,是关联关系的一种,个体可离开整体单独存在(如汽车与具体零部件),故代码实现上E类内的F类的创建为setF方式,而非创建新的F类。具体表现形式与关联关系一致,表现为:对象作为另一个类的成员变量。此种关系是持续的,长期的,固定的。
UML表示为: 带空心菱形的实线,菱形指向整体
4.组合(Composition)
一种整体 - 部分关系,是关联关系的一种,部分不可离开整体单独存在,即整体与部分的生命周期相同(如国与家),故代码实现上G类内的H类在构造函数中进行创建。具体表现形式与关联关系一致,表现为:对象作为另一个类的成员变量。此种关系是持续的,长期的,固定的。
UML表示为: 带实心菱形的实线,菱形指向整体
5.泛化/继承(Generalization/Inheritance)
一种is-a关系,表示一般与特殊的关系,一种为扩展原有类的功能,一种为子类与父类在某些行为或属性表现不一致时,子类特化父类的行为及属性,故仅用继承说法其实是不全面的。如增强工具类扩展基础工具类,猫,狗继承动物类。
Tips:派生类对象的构造
派生类只能采用构造函数初始化列表的方式向基类或成员对象的构造函数传递参数,形式如下:
派生类构造函数名(参数表):基类构造函数名(参数表),成员对象名1(参数表),…{
//……
}
先构造基类, 再构造成员, 最后构造自身(调用构造函数)
基类构造顺序由派生层次决定:最远的基类最先构造
成员构造顺序和定义顺序符合
析构函数的析构顺序与构造相反
UML表示为: 带三角箭头的实线,箭头指向父类
6.实现(Implementation/Realization)
一种is-a关系,一种类与接口的关系,即父类为虚基类(接口),类进行接口的具体实现。
UML表示为: 带三角箭头的虚线,箭头指向虚基类(接口)
参考的相关链接如下:
从类关系说起 - Java
类的关系——依赖关系 - Java
UML类图