UML,全称:Unified Modeing Language,关于UML的历史和详细描述可以参考《UML参考手册》。UML主要是由一些视图组成,包括静态视图(static
view),用例视图(use case view),活动视图(Active view)。对于开发人员来说,更重要的是静态视图里面的类图(class view)和交互视图中的顺序视图(sequence
diagram)。
类图可以帮助我们了解一个系统的结构,而类图除了需要描述单独的类名称、属性和操作外,我们还需要描述类之间的联系。在UML类图中,类与类之间的关系用不同的连线表示。类之间的关系有继承、依赖、关联、聚合和组合。
- 1. 继承(泛化关系)
指的是一个类(称为子类)继承另外的一个类(称为基类)的功能,并增加它自己的新功能的能力,继承是类与类之间最常见的关系。如下图所示,一般有一条带空心三角形的线表示继承关系。
继承
代码实例
// A,B,C(子类) 都继承自Base(父类) class Base {...}; class A : public Base {...}; class B : public Base {...}; class C : public Base {...};
- 2. 依赖
大多数情况下,依赖关系体现在某个类的方法使用另一个类的对象作为参数。是一种比较弱的关系,存在偶然性和临时性,一般表现形式为:
- A类是B类中的(某种方法的)局部变量;
- A类是B类方法当中的一个参数;
- A类向B类发送消息,从而影响B类发生变化;
其UML图为(一条带箭头的虚线由依赖一方指向被依赖方)
依赖
代码示例:
class A {...}; class B { public: fuc(A* a); };
- 3. 关联
是类之间的一种语义联系(较弱)。它使一个类知道另一个类的属性和方法。关联可以有方向,可以是单向关联,也可以是双向关联。这种关系比依赖稍强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的,表现在代码层面,为被关联类B以类属性的形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量;
UML图中用一条实线箭头表示:
关联
示例代码:
class A {...}; class B {A* a;};
- 4. 聚合
是整体与部分的关系,是has-a的关系,他们可以有各自的生命周期,部分可以属于多个整体对象。聚合关系与关联相比,关联一种平等的关系(如你和你的朋友之间),而聚合是一种不平等的关系(你和你的书之间)。
UML图如下:
示例代码:
class A {...}; class B {A* a;};聚合的代码表现和关联一致,只能从语义上区分了。
- 5. 组合
是整体与部分的关系,是constains-a的关系,这种关系比聚合更强,部分与整体之间由同生共死的关系,组和对象一旦删除,也就意味着部分的删除(如你和你的心脏之间)。
UML图如下:
组合
代码示例:
class A {...}; class B {A a;};组合和聚合在代码层面上有较大的差异,上例组合关系中直接实例化了A类的一个对象a,那么B类的一个对象消亡的同时也意味着对象a的消亡,所以是一种同生共死的关系。
UML图 依赖、关联、聚合、组合