UML速成
面向对象程序设计与UML建模知识
1. 面向对象程序设计基础
1.1 面向对象程序设计的三大特性
- 封装
- 继承
- 多态
1.2 面向对象的概念
面向对象=对象+类+继承+消息传递 可以说,这4个概念涉及面向对象的基本建模原则:抽象、封装、继承、分类等。
- 对象,是系统中用来描述客观事物的一个实体,它是用来构成系统的一个基本单位。对象由一组属性和一组行为构成。属性是用来描述对象静态特征的数据项,行为是用来描述对象动态特征的操作。
- 类,是具有相同属性和行为的一组对象的集合。它为属于该类的所有对象提供了统一的抽象的描述,主要包括属性和行为两部分。
- 继承,是特殊类的对象拥有其一般类的全部属性和行为。
- 消息传递,是对象间通信的手段,一个对象通过向另一个对象发送消息来请求其服务。一个消息通常包括接收的对象名、调用的操作和相应的参数。
1.3 面向对象的设计原则(6个)
开放封闭原则,单一职责原则,依赖倒置原则,Liskov替换原则,迪米特法则,接口隔离原则
面向对象设计的六大原则(SOLID + 迪米特)简单解释如下:
- 单一职责原则:一个类只负责一项职责。修改理由只有一个,避免修改一个功能时影响其他不相关功能。
- 开放封闭原则:对扩展开放,对修改封闭。应通过增加新代码扩展行为,而不是修改已有代码。
- 里氏替换原则:子类必须能替换父类且程序行为不变。即子类不重写/破坏父类的方法约定,避免继承后逻辑异常。
- 依赖倒置原则:高层模块不依赖低层模块,两者都应依赖抽象(接口/抽象类)。细节依赖抽象,便于解耦和替换实现。
- 接口隔离原则:客户端不应依赖它不需要的接口。将臃肿接口拆分成多个专用小接口,避免实现类被迫实现无用方法。
- 迪米特法则(最少知道原则):一个对象应尽量少地了解其他对象内部细节。只与直接朋友(参数、成员、返回值等)通信,减少类间耦合。
2. UML与软件建模
2.1 UML构成
基本构造块,语义规则和公共机制组成
2.1.1 基本构造块包括事物,关系和图
2.1.1 关系(39页)
- 依赖:临时性,像临时变量,一般为虚线
- 关联:b是a的一部分
- 泛化:继承
- 实现:接口与实现的类
2.2 软件建模的原因是什么?
- 统一沟通:提供标准化的图形语言,减少团队间的理解偏差。
- 管理复杂度:从静态结构和动态行为等多角度抽象系统,使设计更清晰。
- 设计蓝图:在编码前验证方案可行性,降低修改成本。
- 文档与维护:作为轻量级系统文档,便于新人理解及后续维护。
- 支持工程自动化:可正向生成代码骨架,或逆向分析已有代码。
UML建模通过标准化的可视化设计,提升团队沟通效率、降低系统复杂度,并作为设计与文档的通用蓝图。
3. 用例图
3.1 用例图要点
3.1.1 主要参与者(发起动作,放左侧)和次要参与者(响应动作,放右侧)
3.1.2 关系图

3.2 题目
3.2.1 用例之间的关系可分为包含、扩展、泛化,对比分析三种关系
- 包含关系中基本用例的部分功能被提取出来,组成另一个独立的用例——包含用例。因此,在包含关系中,基本用例的部分功能需要包含用例来提供,即包含用例是一定会执行的。
- 扩展关系和泛化关系类似,都是对一个公共用例进行功能扩大。不同的是,在泛化关系中,子用例可能提供了覆盖父用例的功能,且子用例可以单独执行;在扩展关系中,扩展用例(相当于子用例)只能提供基本用例(相当于父用例)没有的功能,且扩展用例不能单独执行,且扩展用例的执行受基本用例中的扩展点上的条件约束。
3.2.2 用例的核心是什么?如何体现?
用例的核心是用例和参与者之间的交互行为,由用例描述表达
3.2.3 用例描述的核心是什么?
包括六部分:用例名,参与者,前置条件,后置条件,主事件流,子事件流
3.2.4 用例模型的组成是什么?
用例图+用例描述,用例图包含参与者,用例,他们之间的关系。用例描述说明每一个用例的动作序列和详细情况。
3.2.5 简述用例图,用例模型,用例建模三者之间的关系
多个用例图构成用例模型,用例建模是构建用例模型的过程。
4. 类图与对象图
4.1 类的属性(方括号表示可选项)
\[可见性\]属性名
\[:类型\]\[\'\[\'多重性\[次序\]']']
\[=初始值\]\[{约束特性}\]
4.2 类的操作
\[可见性\]操作名
\[(参数列表)\]\[:返回类型\]
\[{约束特性}\]
4.3 类的关系

5. 顺序图与协作图
5.1 顺序图(调用消息,异步消息,返回消息,阻止消息和超时消息)
返回消息用虚线来表示。

5.2 协作图
协作图就是将顺序图的那些对象单独拎出,然后根据顺序图从上到下的消息进行划线,将单独拎出的对象进行联系,并标注消息的序号来表示先后顺序。
6. 状态图与活动图
6.1 状态图

6.2 活动图
- 注意可以有多个结束节点
- 注意异步操作的实现,和最后等待所有异步操作都结束的join节点

- 泳道分组后更清晰

