首页 > 代码库 > UML图 依赖、关联、聚合、组合

UML图 依赖、关联、聚合、组合

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的消亡,所以是一种同生共死的关系