Zhangxu's Blog.

类图的相关概念

Word count: 865 / Reading time: 3 min
2018/10/18 Share

学了好长时间Java才接触到类图的相关概念,其实我觉得大可在学Java之前就普及相关知识,最近看了相关的东西借此从结下自己的理解。

我们可以把类图看作我们写程序之前准备的草稿或图纸,不要求我们详尽设计,只是构建出一个相对明晰的整体框架,帮助我们从宏观架构我们的项目。

类图将类与类之间的关系氛围以下几种:

  • 实现
  • 泛化
  • 聚合
  • 组合
  • 关联
  • 依赖

实现 泛化

我觉得可以将它们放在一起来看,因为它们都体现出类的一种继承结构,也即 is-a 的关系,举个例子:自行车是车、猫是动物

那么在实际的代码中实现表示继承抽象类,符号是一条带空心箭头的虚线,箭头方向表示继承自,继承自谁就指向谁。

实现

泛化,从字面上理解就有推广开来的意味,在实际代码中是继承自非抽象类,符号是带空心箭头的实线。

泛化

聚合 组合

其实组合是一种特殊的聚合,区别聚合与组合原则在于:整体不存在时部分是否还存在?

如果整体不存在时部分还存在,那就是聚合它的整体和部分不是强依赖的,比如羊群解散了羊作为一个独立的个体仍然是存在的,聚合关系用一条带空心菱形箭头的直线表示,如下图表示A聚合到B上,或者说B由A聚合:

聚合

反之如果整体不存在时部分也不存在了,那就是组合它是一种强依赖的特殊聚合关系,例如:公司不存在了,部门也将不存在了,组合关系用一条带实心菱形箭头直线表示,如下图表示A组成B,或者B由A组成;

组合

依赖 关联

一个对象A在运行期间会用到另一个对象B我们就称作A依赖B,他们之间的关系就是依赖关系。

显然关联关系也是依赖关系的一种,区别在于关联关系是一种静态关系, 通常与运行状态无关,一般由常识等因素决定的,它一般用来定义对象之间静态的、天然的结构。所以,关联关系是一种“强依赖”的关系;比如学生和学校就是一种关联关系。关联关系是用一条直线表示的默认不强调方向,表示对象间相互知道;如果特别强调方向,如下图,表示A知道B,但 B不知道A:

关联关系在最终代码中,通常是以成员变量的形式实现的。

关联

而依赖它是一种临时性的关系,通常在运行期间产生,并且随着运行时的变化,依赖关系也可能发生变化。因此在最终代码中,依赖关系体现为类构造方法及类方法的传入参数,因为参数是可以在运行时动态变化的。依赖关系是用一套带箭头的虚线表示的如下图表示A依赖于B:

依赖

由此可见,上面的组合和聚合也是一种依赖,而且是强依赖关系–关联关系。

CATALOG
  1. 1. 实现 泛化
  2. 2. 聚合 组合
  3. 3. 依赖 关联