UML的类图是用于描述系统静态结构的核心工具,广泛应用于面向对象的分析与设计。
类图通过展示类、接口、属性、方法以及它们之间的关系,从而帮助开发者理解系统架构,减少沟通成本,并且为系统的实现提供可视化设计方案。
一、类图的核心组成部分
1. 类(Class)
类图中的类用矩形表示,矩形通常分为三部分:
- 类名(顶部)
- 属性(中间,格式:[可见性] 属性名: 类型)
- 方法(底部,格式:[可见性] 方法名(参数列表): 返回类型)
可见性符号有以下4种:
符号 | 可见性 |
---|---|
+ | public(公共) |
- | private(私有) |
# | protected(受保护) |
~ | package/default(包内可见) |
示例:
如上图所示Car 类的顶部使用C
标出,代表它是一个类,然后它有三个属性(model
、engine
和wheels
),均为私有属性(图中显示为红色小方块),另外还有三个方法:move()
、addWheel()
和setEngine()
,它们都是公有属性(图中显示为绿色实心原点)。
2. 接口(Interface)
接口用带 <<interface>>
的矩形表示,并且只包含方法声明。
示例:
如上图所示,IElectric
接口的顶部使用I
标出,代表它是一个接口,然后它声明了两个方法:charge()
和 getBetteryLevel()
。
在C++中,接口也可以用抽象类代替
二、类之间的关系
类图通过不同的连线符号描述类之间的交互,常见的关系包括:
1. 依赖(Dependency)
依赖关系表示一个类的变化可能影响另一个类,通常表示类之间的临时性或松散耦合关系。
表示方式:虚线箭头
示例:
上图中,Driver
类可以代表司机,司机需要一辆车,但这辆车不一定得是他自己的,所以只需要在使用drive
方法的时候传入一个Car
就可以了。
2. 关联(Association)
关联关系表示类之间的长期关系,在代码中往往表现为在一个类中拥有另一个类的实例变量。
表示方式:实线箭头
示例:
某人(Somebody)拥有一辆自己的汽车(Car),这是一种长期关系而不再是临时使用的关系。
因此,可以在图中看到Somebody
类持有一个Car类型的成员变量。
关联关系可以进一步分为单向关联、双向关联和自关联,本节示例是一个单向关联
3. 聚合(Aggregation)
聚合关系强调整体包含部分,但这是一种弱关系,部分可以脱离整体而单独存在,并且部分的生命周期与整体相对独立。
表示方式:实线空心菱形
示例:
如上图所示,汽车(Car)包含轮胎(Wheel),但轮胎可以单独存在。
3. 组合(Composition)
组合也是表示整体与部分的关系,但这是一种强关系,部分不能独立于整体存在,生命周期与整体绑定。
表示方式:实线实心菱形
示例:
房子(House
)包含房间(Room
),但房子没了,那房间也就没了。
1..*
代表房子可以拥有多个房间
4. 泛化(Generalization)
泛化表示继承关系,其中子类继承父类的属性和方法。
表示方式:实线空心三角形
示例:
显然,汽车(Car)继承自交通工具(Vehicle)。
5. 实现(Realization)
实现关系表示一个类实现了接口声明的方法。
表示方式:虚线空心三角形
示例:
电车(ElectircCar
)实现了IElectric
声明的两个方法:充电(charge
)与电池电量查询(getBatteryLevel
)。
三、综合实例
根据以上内容,我们可与构建一个汽车系统:
如上图所示,系统中包含汽车(Car
)、引擎(Engine
)、轮子(Wheel
)、交通工具(Vehicle
)、电车(ElectricCar
)与人(Somebody
)
其中:
Vehicle
是基类,包含速度和启动/停止功能Engine
和Wheel
是辅助类,分别表示引擎和轮子Car
是派生类,继承自Vehicle
,并包含引擎和轮子IElectric
是一个接口,定义了电车需要实现的充电和电池电量查询方法ElectricCar
是Car
的子类,并且实现了IElectric
接口Somebody
表示某人拥有一辆电车ElectricCar
类图中包含了四种关系:
-
聚合:
Car
和Wheel
之间是聚合关系,Car
和Engine
之间也是聚合关系 -
泛化:
Vehicle
与Car
是继承关系,Car
与ElectricCar
也是继承关系 -
实现:
IElectric
与ElectricCar
是实现关系 -
关联:
Somebody
与ElectricCar
是关联关系
四、总结
类图是面向对象分析与设计的核心工具,通过合理使用类图,可以有效地帮助开发团队进行系统架构的规划、沟通与重构。
本文首发于微信公众号《Linux在秋名山》,欢迎大家关注~