七张图搞懂UML中的类图

1,258 阅读4分钟

​类图

概念与解析

  • 类图的构造,类图由四部分构成,分别为:类名、属性层、方法层、性质层,其中除了类名必须存在,其它层可以省略。

  • 类图中的类名如果是正体则说明该类是具体的,如果是斜体字,则表明类是抽象的

  • 类图的第二层是属性层,属性可以是public、private、protected,如果一个属性的左边是加号(+)则该属性是public,左边如果是减号(-)则该类是private,左边如果是井号(#)则该属性是protected。

  • 第三层是方法层,方法层中也分为public、private、protected,区别跟属性层中一致。同时如果一个方法下面有下划线,则表明该方法为静态方法。

  • 接口的类图与类的类图唯一的区别在于类名中加了interface,标志该类图是一个接口的类图。

类图中的关系

在类与类之间会有连线指明它们之间的关系。类和类、类与接口、接口和接口之间可以建立以下几种关系:一般化关系、关联关系、聚合关系、合成关系和依赖关系,另外这几种关系都是静态的。

  • 一般化关系:一般化关系表示类与类之间的继承关系(Java中的extends),接口与接口之间的继承关系(Java中的extends关键字,一个接口可以extends多个关键字,但是不能implements任何接口),或者类与接口的实现关系(Java中的implements关键字)。所以一般化关系在Java中的实现通过extens或者implements,extends描述类与类、接口与接口关系,implemens描述类与接口的关系。

(上图实现了类与类、类与接口、接口与接口之间的一般化关系)

  • 关联关系:关联关系是类与类之间的联接,这种联接使一个类可以知道另一个类的属性和方法。同时关联可以是双向的,也可以是单向的。关联关系在Java中是通过类中的实例变量实现的,例如司机与汽车的相关类,问题与答案的相关类。并且在关联关系中每个关联的端点还可以有一个基数,表明这一端的类可以有几个实例,也就是在Java中所对应的一对一、一对多、多对多的问题。比如一个司机可以有多辆汽车,一个问题可以有多个答案,一个答案又可能对应多个问题。

(单向关系)

(双向关系)

  • 聚合关系:聚合关系是关联关系的一种,是强的关联关系,可以理解为一个整体必须需要哪些个体,比如一台电脑必须要有CPU、硬盘、主板、内存等,所以理解成聚合关系就是电脑类必须要关联CPU类、硬盘类、主板类、内存类等必须的类,从而保证电脑整体的完整性。因此这里聚合关系与关联关系的区别在于对于整体性与个体的判断,在关联关系中所涉及的类都是平等的,但是在聚合关系中涉及的类不是同一层次的,其中一个代表整体,其它的代表个体。

(聚合关系的体现)

  • 合成关系:合成关系也是关联关系的一种,并且它是比聚合关系还要强的一种关系, 合成关系的强主要体现在代表整体的对象负责代表部分对象的生命周期,并且合成关系是不能共享的。代表整体的对象需要保持部分对象的存活。例如美猴王和它的四肢以及金箍棒之间的关系,美猴王和金箍棒是聚合关系,而美猴王和它的四肢关系则更强,是合成关系,因为美猴王的四肢完全由美猴王自己负责,并且不能共享。

(合成关系的体现)

  • 依赖关系:依赖关系是类与类之间的连接,依赖总是单向的。依赖关系表示一个类依赖与另一个类,也就是一个类需要通过依赖的类来实现,这样构成一个依赖关系。比如Person类依赖于Car类和House类,这样Car类和House类就需要在Person类的引用中进行实现,并且Person类中没有Car或者House类型的属性,Car和House的实例是以参数的形式传入到Person类中的引用方法中的。

(依赖关系的体现)

既然Car和House类是以参数的形式传递到Person类中的引用方法中的,那么在Java中这种依赖就体现在局部变量、请求参数、以及静态方法的调用。

参考资料:

1、《Java与模式》