UML类图是什么
维基百科:In software engineering, a class diagram in the Unified Modeling Language (UML) is a type of static structure diagram that describes the structure of a system by showing the system's classes, their attributes, operations (or methods), and the relationships among objects. 翻译下:UML类图是一种通过展示系统中的
类、属性、方法以及对象间关系
,来描述系统结构的静态结构图
。
提示,UML图有很多种,比如时序图、用例图,这里只针对类图做讲解。
为什么要学习UML类图
这牵扯到一个问题,设计模式是什么? 设计模式,即Design Patterns,是指在软件设计中,被反复使用的一种代码设计经验。使用设计模式的目的是为了可重用代码,提高代码的可扩展性和可维护性。
那么,设计模式的本质是什么?
设计模式的本质是面向对象设计原则的实际运用,是对类的封装性、继承性和多态性以及类的关联关系和组合关系的充分理解
。
一句话总结: UML 类图是表达设计模式的一种方法。
如何学习UML类图
下面,从类的表示、类间关系表示两个角度入手来认识UML类图。为了方便上手,主要形式为举例。(编程语言均为Java)
类的表示
类的定义如下:
class User {
private long id;
private String name;
public void setName(String name) {
this.name = name
}
public String getName() {
return this.name;
}
}
类图如下:(这里用掘金自带的Mermaid图表画的图。如果画图工具不同,展示会有轻微的区别,不用太在意)
classDiagram
class User{
-long id
-String name
+setName(name)
+getName() String
}
- 整体分为三部分
- 上部:包含类名,是唯一必填的信息
- 中部:包含类的属性,仅在描述实例时需要
- 底部:包含类操作(方法)
- 访问修饰符
- public(+)
- private(-)
- protected(#)
- package(~)
- static(下划线)
类间关系的表示
总览
类间关系 | 图形 | 表现形式 | 含义说明 |
---|---|---|---|
继承(泛化) | 实线+空心箭头 | extends关键字 | 对象与对象之间的继承关系,"is a" |
实现 | 虚线+空心箭头 | implements关键字 | 接口及实现类之间的关系 |
关联 | 实线+箭头(可选) | 成员变量 | 对象相互知道的关系,箭头强调一个对象知道另一个 |
依赖 | 虚线+空心箭头 | 方法入参 | 一个对象在运行期间会用到另一个对象的关系 |
聚合 | 实线+箭头+空心菱形 | - | 整体与部分的关系,整体不存在了,部分依然存在 |
组合 | 实线+箭头+实心菱形 | - | 整体与部分的关系,整体不存在了,部分也不存在 |
继承(Generalization)与实现(Implementation)
-
继承:实线+空心箭头(Mermaid语法展示为实心箭头)
class A {} class B extends A {}
classDiagram A <|-- B
-
实现:虚线+空心箭头(Mermaid语法展示为实心箭头)
interface A {} class B implements A {}
classDiagram A <|.. B
关联(Association)与依赖(Dependency)
-
关联:实线+箭头(可选),默认不强调方向,下图表示A知道B,在代码中通常以成员变量形式实现。
class A { private B b; }
classDiagram A --> B
-
依赖:虚线+箭头(可选),是一种弱关联关系,表示一个对象在
运行期间
会用到另一个对象,在代码中通常以类的构造方法或者类方法的入参实现。class A { public void method(B b) {} }
classDiagram A ..> B
聚合(Aggregation)与组合(Composition)
均为整体与部分的关系。
-
聚合:实线+箭头+空心菱形。B由A组成,B不存在了,A依然存在。比如:学生和学校。
classDiagram A o--> B
-
组合:实线+箭头+实心菱形。B由A组成,B不存在了,A也不存在了。比如:汽车与方向盘。
classDiagram A *--> B
常用的UML类图绘制工具
- plantUML,也是写代码画图的形式,我一般用Intellij IDEA的插件画时序图,非常方便。
- Draw.io,可以在线画图,也可以下载客户端。画图很方便,我个人比较喜欢。
- Mermaid插件,第一次用,有些图和我的认知不太相符,目前体验一般,待探索。
- ProcessOn,在线的画图工具,比较方便,但有免费个数限制