UML

2017/3/10 0:2 上午 posted in  设计模式  

表示方式

UML中描述对象和类之间相互关系的方式包括:

  • 依赖(Dependency)。虚线+箭头,指向被依赖元素。
    依赖
  • 关联(Association)。实线+箭头,指向被依赖元素。
    关联
  • 聚合(Aggregation)。空心菱形+实线+箭头,指向被依赖元素(部分)。 聚合
  • 组合(Composition)。实心菱形+实线+箭头,指向被依赖元素(部分)。 组合
  • 泛化(Generalization)。实线+空心箭头,指向继承的父类。 泛化
  • 实现(Realization)。虚线+空心箭头,指向实现的接口。 实现

依赖

  1. 依赖是单向的。
  2. 依赖关系在Java/C++语言中体现为局部变量、方法参数、对静态方法的调用
  3. 依赖不具有“拥有关系”,而是一种“相识关系”。

方法参数示例:

public class Person
{
    void buy(Car car)
   {
       ...
    }
}

关联

  1. 关联可以是双向的,也可以是单向的(还有自身关联)。双向关联可以有2个箭头或没有箭头,单向关联有1个箭头。
  2. 在Java/C++中,关联关系通过使用成员变量来实现。
  3. 关联表现为“拥有关系”。
public class 徒弟
{  

}

public class 唐僧
{
     protected: list<徒弟> tdlist;
}

聚合

  1. 聚合关系是关联关系的一种,是强的关联关系。
  2. 聚合是整体和部分之间的关系,是一种弱拥有关系,整体和部分可以有不一样的生命周期
  3. 聚合关系也是通过成员变量来实现,但关联关系所涉及的2个类处于同一个层次上,而聚合关系2个类处于不同的层次上,一个代表整体,一个代表部分。
  4. 关联与聚合仅从Java/C++语法上无法分辨,需要考察所涉及的类之间的逻辑关系。
public class 引擎
 {

 }
public class 轮胎
 {

 }
public class 汽车
{
        protected:引擎 engine;
        protected:轮胎 tyre[4];
}

组合

  1. 组合关系是关联关系的一种,是比聚合关系还要强的关系。
  2. 组合关系中整体与部分拥有相同的生命周期。
class 肢
 {
 }
 class 人
 {
        protected:  肢   limb[4];
 }

泛化

表示类或接口之间的继承关系。
Java中使用extents关键字。

实现

表示类实现接口。
Java中使用implements关键字。

几种关系的综合比较

组合>聚合>关联>依赖

其中依赖(Dependency)的关系最弱,而关联(Association),聚合(Aggregation),组合(Composition)表示的关系依次增强。

换言之关联,聚合,组合都是依赖关系的一种,聚合是表明对象之间的整体与部分关系的关联,而组合是表明整体与部分之间有相同生命周期关系的聚合。

而关联与依赖的关系用一句话概括下来就是,依赖描述了对象之间的调用关系,而关联描述了对象之间的结构关系。

参考

UML类图符号 各种关系说明以及举例