前言:因为最近在看设计模式,发现UML类图知识欠缺呀,便有了这篇文章
一、概述
-
类图(Class Diagram)用来表示不同的实体(人、事物、数据),以及他们彼此之间的关系
-
描述了系统中对象的类型以及它们彼此之间存在的各种静态关系
-
面向对象建模中的核心工具
二、类图的元素
1、类
是具有相似结构、行为和关系的一组对象的描述符
-
类的示意图分为三个部分:类名、属性、方法/函数
-
类名:类的名称,斜体则该类为抽象类
-
属性:完整表达式 可见性 属性名称 :类型 [= 默认值]
可见性有三种类型:
+: 表示public
-: 表示private
#: 表示protected
-
方法:完整表达式 可见性 方法名称 (入参类型列表) [:出参类型],方法为斜体则为抽象方法
注意:
中括号的内容表示可选
2、连接线
-
常见的连接线
-
数量对应关系:标注在连接线的开头或结尾(多用于关联、依赖关系,以及组合、聚合关系)
标识 含义 1 1个 * 若干个 0..1 0或1个 0..* 0或多个(等同于*) 1..* 1或多个 除了两点能表示Or(或)关系,逗号(,)也能用来表示Or关系
三、常见关系简述
常见的6种关系:泛化(继承)、实现、组合、聚合、关联和依赖
1、泛化(Generalization)
- 是一种继承关系,表示一般与特殊的关系,子类如何特殊化父类的所有特征和行为
- 箭头方向:从子类指向父类
2、实现(Realization)
- 是一种类与接口的关系,表示类是接口所有特征和行为的实现
- 箭头方向:从实现类指向接口
3、依赖(Dependency)
-
是一种调用的关系,即一个类的实现需要另一个类的协助,
-
使用Java语言描述:即调用方类B中,某个方法的入参类型、局部变量类型或静态方法调用等的类型为被调用方类A
public class ClassA{} public class ClassB{ public void doSomething(ClassA classA) {} // 类A作为类B方法的入参 public void doSomething() { ClassA classA; // 类A作为类B的局部变量 } public String getSomething() { return ClassA.info(); // 在类B调用类A的静态方法 } } -
箭头方向:从被依赖者(调用方)指向依赖者(被调用者)
-
4、关联(Association)
- 是一种引用关系,它使一个类知道另一个类的属性和方法,即引用方持有一成员变量的类型为被引用方
- 关联可分为单向关联、双向关联、自关联
- 箭头方向:从被引有者指向引有者(双向关联可无箭头)
5、聚合(Aggregation)
- 也表示整体与部分的关系,但部分可以离开整体而单独存在。是关联关系中的一种。
- 箭头方向:从部分指向整体
6、组合(Composition)
- 表示整体与部分的关系,部分离开整体后无法单独存在。是聚合关系中的一种。
- 箭头方向:从部分指向整体
四、类图关系之间的总结
- 实体之间耦合度的强弱顺序:泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖
- 关联和依赖的主要区别:依赖带有偶然性,而关联则是必然的
- 关联、依赖和聚合组合之间的区别:聚合和组合是讨论整体与组成它的部分之间的关系
五、参考资料
1、人人都懂设计模式:从生活中领悟设计模式:Python实现 / 罗伟富.