类图 Class Diagram 详解
UML(Unified Modeling Language)中的类图是一种用于描述系统中的类、对象以及它们之间关系的图形化建模工具。类图是UML中最常见和最基础的图之一,它提供了一种直观的方式来表示系统的静态结果,展示了系统中各个类的属性、方法以及它们之间的关系。
类图由以下元素组成:
类(Class)
类是类图的主要元素,用矩形表示。类名位于矩形的顶部,通常采用驼峰命名法,类中包含属性和方法。
属性(Attribute)
类的属性表示类的状态或特征。属性位于类的中部,通常以名称:类型的形式表示,例如“name: String”。属性可以是公有、私有或保护的。
方法(Method)
类的方法表示类的行为或操作。方法位于类的底部,通常以名称(参数列表):返回类型的形式表示,例如“setName(name: String): void”。
属性和方法的访问权限
-表示私有的 private#表示受保护的 protected+表示公开的,public~表示包访问权限,package-private
示例:
classDiagram
class Student {
- name: String
- age: int
+ getName(): String
+ setAge(age: int): void
}
类图中常用的关系表示方式
依赖关系
依赖关系表示一个类的变化可能会影响另一个类。依赖关系通常在一个类使用另一个类的服务或接口时出现。依赖关系用虚线箭头表示,箭头指向被依赖的类。
例如:
classDiagram
Animal ..> Food: 动物依赖食物
组合关系
组合关系表示一个类包含另一个类的对象,这种关系是一种强关联关系,被称为“整体-部分”关系。组合关系通常用来表示一对多的关系,其中整体对象包含部分对象。这意味着整体对象的生命周期负责管理部分对象的生命周期。
在UML类图中,组合关系通常用实心菱形和直线表示,实心菱形指向包含整体对象的类,而直线指向被包含的部分对象的类。
例如:
classDiagram
Dog *-- Leg : 狗(通常)拥有 4 条脚
关联关系
关联关系表示两个类之间的连接或关联。关联关系可以是单向或双向的,它描述了类之间的关联性,但并未指定关联的强度或者持续时间。关联关系用一条直线表示,线上可以标注关联的角色、多重性和导航性等信息。
单行关联:
单向关联关系可以通过使用实线的箭头表示,箭头通常从关联的源类指向目标类,表示关联的方向。
订单(Order)与客户(Customer)的关系是单向关联关系的,在一个电子商务系统重,每个订单都与一个客户相关联,表示客户下的订单。在这种情况下,可以建立一个单向关联关系,其中订单类(Order)引用了客户类(Customer),但是客户类(Customer)不引用订单类(Order)。那么箭头应该从订单类(源类)指向客户类(目标类)。
classDiagram
Order --> Customer : 单向关联关系
class Customer {
id: int
name: String
}
class Order {
id: int
customerId: int
}
双向关联:
双向关联关系通常不需要使用箭头,而是通过一条实线连接关联的两个类。
老师(Teacher)和学生(Student)的关系就是双向的关联关系,老师有多个学生,而学生也有多个老师,他们是双向关联关系。
classDiagram
Teacher -- Student : 双向关联关系
聚合关系
聚合关系表示整体与部分之间的关系,但与组合关系不同,聚合关系中部分可以脱离整体单独存在。聚合关系用一个带有空心菱形的实现表示,空心菱形位于整体一端,箭头指向部分。
一年六班的同学们(Students) 与 一年六班的小白(Student) 就是 聚合关系,小白(部分)可以脱离整体(同学们)。
classDiagram
Students o-- XiaoBai : 聚合关系(小白是集体中的一员)
继承关系
继承关系表示一个类(子类或派生类)继承另一个类(父类或基类)的属性和行为。继承关系是面向对象编程中的一个重要概念,它允许在现有类的基础上创建新类,并继承已有类的特性,同时可以添加、修改或覆盖部分特性来定义新的行为。
在UML类图中,继承关系通常使用带有三角箭头的实现表示,箭头指向父类。
classDiagram
Animal <|-- Dog : 继承关系(狗继承了动物)
接口实现
接口实现表示一个类实现了一个或多个接口。接口是一种抽象类型,它定义了一组方法或行为,而接口实现则是类提供对这些方法的具体实现。
在UML类图中,接口实现关系通常用带有虚线的三角形箭头表示,箭头指向实现的接口。
classDiagram
Parrot ..|> TalkAbility : 鹦鹉实现了说话(接口)能力
Parrot ..|> FlyAbility : 鹦鹉实现了飞翔(接口)能力
下图是“大话设计模式”中经典的一个例子,小伙伴们看懂这张图,就已经把UML类图基本吃透啦。
classDiagram
class 动物 {
+ 生命
+ 新陈代谢(氧气, 水)
+ 繁殖()
}
class 鸟 {
+ 羽毛
+ 下蛋()
}
class 大雁 {
+ 下蛋()
+ 飞行()
}
class 鸭子 {
+ 下蛋()
}
class 企鹅 {
+ 下蛋()
}
class 唐老鸭 {
+ 说话()
}
class 氧气 {
}
class 水 {
}
class 翅膀 {
}
class 大雁群 {
+ V形飞行()
+ 一形飞行()
}
class 气候 {
}
class 飞翔接口 {
<<Interface>>
+ 飞()
}
class 说人话接口 {
<<Interface>>
+说话()
}
动物 ..> 氧气 : 动物<mark>依赖</mark>氧气
动物 ..> 水 : 动物<mark>依赖</mark>水
动物 <|-- 鸟 : 鸟<mark>继承</mark>动物
翅膀 --* 鸟 : 组合关系
鸟 <|-- 大雁 : 大雁<mark>继承</mark>鸟
鸟 <|-- 鸭子 : 鸭子<mark>继承</mark>鸟
鸟 <|-- 企鹅 : 企鹅<mark>继承</mark>鸟
大雁群 o-- 大雁 : 聚合关系
企鹅 --> 气候 : 单向关联关系
大雁 ..|> 飞翔接口 : 大雁实现了飞翔接口
鸭子 <|-- 唐老鸭 : 唐老鸭<mark>继承</mark>鸭子
唐老鸭 ..|> 说人话接口