文章目录
参考:Class Diagram | Unified Modeling Language (UML)
UML是软件设计和面向对象编程中常用的一种标准化建模语言,对于可视化系统结构和功能非常有用,类图有多种不同类型的图:用例图,类图,时序图,活动图和状态图,每类图都有规范的表示,不局限于语言,本文介绍以下内容
(1)UML的图分类
(2)类图的表示
(3)类图的关系
(4)类图的作用
1.UML
Unified Modeling Language(UML)是一种标准化的建模语言,用于在软件系统开发过程中可视化、描述和设计软件的结构与行为。UML 提供了一系列图表,帮助开发人员、系统架构师以及相关人员交流系统的设计和功能。UML 包括许多不同类型的图:
- 用例图(Use Case Diagram):描述系统的功能需求以及外部参与者的交互
- 类图(Class Diagram):描述系统的静态结构,展示类、属性、方法以及类之间的关系
- 时序图(Sequence Diagram):展示对象之间的消息传递顺序,描述时间序列中的动态行为
- 活动图(Activity Diagram):用于表示系统中的流程和业务逻辑
- 状态图(State Diagram):描述系统或对象的状态以及状态之间的转换
2.Class Diagram
2.1 类图的表示
在类图中,类用方框表示,每个方框包含三个部分:类名,属性和方法,方框之间的连接线说明这些类的关系。类图提供了系统设计的高级概述,有助于沟通和记录软件的结构。它们是面向对象设计的基本工具,在软件开发生命周期中起着至关重要的作用。
如图所示的方框为类Car
的类图表示
- Class Name:第一个小框描述了类名,通常放在方框中间加粗,类民首字母大写
- Attributes:第二个小框介绍了类的属性(字段),包括属性名,属性的可见性和数据类型
- Methods:第三个小框介绍了类的方法,代表了类的行为函数,包括可见性,返回类型和参数
- Visibility:可见性表示了属性和方法的可获取水平
(1)+:public公共,对所有类可见
(2)-:private私有,仅在类内可见
(3)#:protected保护,对子类可见
(4)~:包或默认可见性,对同一包中的类可见 - Parameter:方法中的参数显示了类之间的信息流动
(1)in:输入参数是从调用对象(client)到被调用对象(server)的参数
(2)out:输出参数是从被调用对象(server)到调用对象(client)的参数
(2)inout:输入输出参数同时作为输入和输出,在client和server之间进行信息流通
2.2 类间的关系
在类图中,类之间的关系有以下几种:
比较常见的分类是6种:关联,聚合,组合,泛化(继承),实现,依赖,还有一些概念更细分的,比如直接关联,使用依赖等。
关系 | 描述 |
---|---|
关联Association | 表示类之间的长期持久关系,一个类持有另一个类的引用,通常通过成员变量表示 |
聚合Aggregation | 整体和部分关系,部分可以独立于整体 |
组合Composition | 整体和部分关系,部分不能独立于整体 |
泛化Generalization | 子类继承父类属性和方法,可扩展和重写 |
实现Realization | 通过抽象类定义接口,客户端和实现解耦 |
依赖Dependency | 表示类之间临时的关系,一个类需要短暂使用另一个类的某个功能,通常通过方法调用实现 |
2.2.1 关联
此处介绍两种:关联和直接关联,由于概念比较类似放在一个小节
(1)关联Association:是泛指两个类之间的关系,可以是双向或单向,也可以是弱耦合的逻辑联系,用直线表示
关联举例:选课系统中学生和课程之间是双向关联,学生可以注册多门课程,每门课程可以有多个学生,Student类和 Course类存在关联关系,但是并不代表Student类直接引用 Course类的实例。如下面代码所示,student1和course1的实例创建是独立的,但是student1中的enroll方法会用到course1,course1的add_student也会添加student1
class Student:
def __init__(self, name):
self.name = name
self.courses = [] # 一个学生可以注册多门课程
def enroll(self, course): # 学生注册课程,课程添加学生
self.courses.append(course)
course.add_student(self)
class Course:
def __init__(self, title):
self.title = title
self.students = [] # 一门课程可以有多个学生
def add_student(self, student):
self.students.append(student)
# 创建实例
student1 = Student("Alice")
course1 = Course("Math")
# 学生注册课程
student1.enroll(course1)
(2)直接关联Direct Association:强调单向依赖关系,一个类直接持有或依赖另一个类的实例,用带单向箭头的直线表示,箭头指向被持有的类。
直接关联是关联的一种更具体的表现,表示类之间有更明确的耦合关系
直接关联举例:学生和身份证之间存在一种直接关联。每个学生都必须有一个身份证,学生对象直接持有身份证对象。Student类和IDCard类之间有一个单向的直接关联,这是一种更强的依赖关系,表示Student 类的对象必须持有一个 IDCard 类的对象才能正常工作。如下面代码所示,student的实例创建必须用到id_card实例
class IDCard:
def __init__(self, card_number):
self.card_number = card_number
class Student:
def __init__(self, name, id_card):
self