本文档为xmind导出,可能存在缺少图片等问题,建议下载思维导图查看完整内容
链接: https://pan.baidu.com/s/17s-utC2C6Qg0tFp61Kw0ZQ?pwd=uq64 提取码: uq64
概述
UML: Unified Modeling Language 统一建模语言
建模
-
定义
- 把不太理解的东西和一些已经较为理解、且十分类似的东西做比较,可以对这些不太理解的东西产生更深刻的理解,这种方法叫做建模
-
原因
-
不能完整地理解一个复杂的系统
-
为了成功开发复杂的软件项目
-
-
四个目的
-
帮助我们按照需要对系统进行可视化
-
允许我们详细说明系统的结构和行为
-
给出了一个指导我们构造系统的模板
-
对我们所做出的决策进行文档化
-
-
四项原则
-
选择要创建什么模型
-
每一种模型可以在不同的精度级别上表示
-
最好的模型是与现实相关联的
-
单个模型是不充分的, 对每一个重要的系统最好用一组几乎独立的模型去处理
-
模型
-
建模产生的结果,就是模型
-
模型是对事物的一种抽象和简化
-
每个模型都有一定的用途
-
模型有我们所关心的所有信息,足矣
术语
-
领域(Domain)
- 指要解决的问题在现实中所处的行业、位置、关系等
-
系统(System)
- 由为完成一定目的而组织起来的子系统组成
-
子系统(Subsystem)
- 是一组元素的集合,代表了系统的一个部分,它有清晰的接口,这个接口可作为一个单独的构件来实现
-
模型(Model)
- 表示对现实的完整而又自我一致的简化,可以更好地理解系统
-
视图(View)
- 是对系统模型的组织和结构的投影,注重于系统的一个方面
-
图(Diagram)
- 一组元素的图形表示
UML特点
-
可视化语言
-
原因
- 与他人交流概念模型很容易出错,除非每个人都说同一种语言
-
好处
-
显式的模型有助于交流
-
可视化建模能够清晰定义软件架构
-
可视化建模能够促进可重用性
-
可视化建模能够处理复杂性
-
可视化建模能够捕获业务流程
-
-
-
说明语言
-
构建语言
-
文档语言
UML组成
-
事物
-
结构事物
-
类(Class)
-
接口(Interface)
-
用例(Use case)
-
协作(Collaboration)
-
构件(Component)
-
主动类(Active class)
-
节点(Node)
-
制品(Artifact)
-
-
行为事物
-
交互(Interaction)
-
状态机(State machine)
-
活动(Activity)
-
-
分组事物
- 包(Package)
-
注释事物
- 注释(Annotational thing)
-
-
关系
-
依赖
-
泛化
-
关联
-
实现
-
-
图
-
类图
-
对象图
-
用例图
-
构件图
-
顺序图
-
通信图
-
时序图
-
活动图
-
制品图
-
包图
-
状态图
-
部署图
-
交互概览图
-
关系
四种基本关系
-
依赖关系(dependency)
- 一个事物使用另一个事物的信息和服务
-
泛化关系(generalization)
- 一般事物(称为超类或父类)和该事物的较为特殊的种类(称为子类)之间的关系
-
关联关系(association)
-
一个事物的对象与另一个事物的对象间的联系
-
自身关联(reflexive association)
- 同一个类的不同对象之间有连接
-
-
实现关系(realization)
关联关系的修饰
-
名称及其方向
-
角色
-
在关联的每一端,表明相连的类在该关联关系中的作用
-
-
多重性(Multiplicity)
- 对于关联关系另一端的类的每个对象,本端的类可能有多少个对象出现
-
聚合/组合(aggregation/composition)
-
聚合
-
整体有管理部分的特有的职责
-
聚合可以替代多继承
-
继承的好处是代码重用,子类直接继承了父类的功能。带来的负面影响是为了继承父类的某些功能,需要承载整个继承树的负荷,有时会使原本简单的系统复杂化。
-
组合/聚合则比较灵活,在需要的时候把其他模块的功能集成到自己的系统。
-
-
-
组合
- 整体拥有部分的生命
-
关联类(Association Class)
-
问题
- 在多对多关系中,一些属性没有办法放在任何一个类中
连接Link
-
连接是关联的实例
-
连接的是对象
-
对象的图形表示
公共机制(Common Mechanism)
定义
- 是UML中适用于各种建模元素的公共建模方法
修饰(adornments)
-
可见性
-
private: -
-
protected: #
-
public: +
-
implementation: ~
-
-
注解(Note)
-
用文字对一个(组)UML建模元素进行解释、约束
-
并不会影响注解的建模元素本身
-
扩展机制(extensibility mechanisms)
-
构造型(stereotype)
-
目的
-
在各种不同的应用领域,用标准的建模元素无法充分表达所需内容
-
需要在现有的建模元素的基础上进行扩充,产生对特定建模问题特有的建模元素
-
-
定义
- 类似于已有的UML建模元素,但又是对特定的问题领域具有特殊含义的新的建模元素
-
三种形式
-
记名的构造型(named stereotype)
-
构造型的图标形式(stereotyped element as icon)
-
带有图标的记名构造型(named stereotype with icon)
-
-
图形表示
-
-
标记值(tagged value)
-
目的
- 出于某种原因需要增加一个新的构成以表达建模元素的某种特性
-
图形表示
-
标记值的字符串由标记值的名字、取值、及分隔符组成
-
-
-
约束(constraint)
-
目的
-
约束用来扩充UML建模元素的语义,以便增加新的规则或修改已有的规则
-
对于一个完备的模型而言,此建模对象必须使该条件被满足
-
-
图形表示
-
用大括弧内的字符串表达式表示
-
可以附加在表元素、依赖关系或注释上
-
-
用例模型
从用户的角度,面向用户的需求,对产品外部功能的建模
需求分类
-
Functional
- 系统做的事情
-
Non-functional
- 系统的质量和属性
-
动态行为
系统边界
-
用户角度
- 外部特性:软件系统通过其边界呈现给用户产品的特性
-
开发者角度
-
需要分析软件产品与外界环境的联系
-
与软件交互的对象
-
软件影响的对象
-
-
-
立足于当前要解决的问题领域,系统边界描述了系统内部与外部之间交互的集合
模型元素
-
参与者
-
代表位于系统之外并和系统进行交互的一类事物(人、物、其他软件子系统等)
-
软件系统的使用者
-
直接和软件系统交互的软件系统赖以运行的软/硬件
-
与软件系统有信息交换的计算机外部设备
-
通过它,可以对软件系统与外界发生的交互进行分析和描述
-
-
图形表示
-
参与者是人
-
参与者是系统
-
-
如何寻找参与者
-
谁使用系统
-
谁安装系统、维护系统
-
谁启动系统、关闭系统
-
谁从系统中获取信息,谁提供信息给系统
-
在系统交互中,谁扮演了什么角色
-
系统会与哪些其他系统相关联
-
内/外部定时器
-
-
-
用例
-
系统为响应参与者引发的一个事件而执行的一系列的处理/动作,而这些处理应该为参与者产生一种有价值的结果
-
要点
-
用例是一项功能,而不是一个动作
-
名称必须是短小精悍的动名词,如修改密码
-
-
元素关系
-
参与者与用例
- 关联关系
-
参与者与参与者
- 泛化关系
-
用例与用例
-
泛化关系
-
包含关系
-
基用例必须包含子用例,基用例才能正常进行
-
可以用于整理出多个用例的共同行为
-
-
扩展关系
-
基用例在一定条件下,可以引入子用例
-
-
用例描述
-
事件流描述
-
使用建模元素
-
标注
-
交互图和活动图
-
-
-
主次事件流
-
主事件流
-
次要事件流
-
-
用例描述形式
类
概念
-
对象
- 拥有数据和行为的一个实体
-
类
-
具有相同属性和行为的一组对象的描述符
-
类的选择依赖于应用领域
-
类的语义是为了描绘此对象代表的事物的性质
-
-
多态(Polymorphic)
- 同一类族的不同对象,可以用不同的行为处理同一条消息
-
继承(Inheritance)
-
一种将两个类关联起来的方法,以便一个类可以使用另一个类的成员而无需重新定义它们
-
继承和泛化是一样的
-
-
封装(Encapsulation)
- 隐藏对象实现细节的过程
-
接口(Interface)
- 特定类或组件的服务的操作集合
-
抽象(abstract)
图形表示
-
在显示时,只有类名 是必须的,其余部分均可以隐藏(模型中仍然存在,但不显示)
-
类名
-
简单名字
-
复杂名字
-
简单名字前面加上一个包含该类所在的模型包的名字
-
这两个名字之间用双冒号(::)隔开
-
-
-
对象
-
UML的隐藏原则
- 隐藏一些对表达问题不重要的属性或操作
实例
概念
-
抽象概念的具体存在
-
一个抽象概念可以对应多个实例
-
一个实例可以与一个或多个抽象概念对应
表示
-
命名
-
具名实例
-
孤体实例
- 省略类型名
-
匿名实例
-
-
类型
-
路径名
交互
概念
-
在任何有意义的系统中,对象都不是孤立存在的,它们之间通过传递消息进行交互
-
对象之间为实现某一功能,必须实施的协作过程、动态行为,称为交互
交互的建模元素
-
对象
-
参与者
-
消息
-
一个对象以某种方式启动另一个对象的活动
-
调用(call):启动某个对象的操作
-
操作是对象所实现的服务
-
对象也可以给自己发送消息
-
-
返回(return):操作向调用者返回一个值
-
发送(send):向一个对象发送一个信息
-
同步消息
-
异步消息
-
-
创建(create):此消息的发送导致目标对象被创建。
-
销毁(destroy):此消息的发送导致目标对象被销毁
-
消息的发送是有顺序的
在顺序图垂直方向上,由上而下顺序执行
因此每一消息都有一顺序号
-
交互的约束
-
Association
- 说明对应的对象通过关联是可见的
-
Self
- 说明对应的对象, 因为是本操作的调遣者,所以是可见的
-
global
- 说明对应的对象在全局范围内可见
-
local
- 说明对应的对象在局部范围内可见
-
parameter
- 说明对应的对象 因为是一个参数,所以是可见的
-
因为连接是关联的实例,多重性不能用于连接
交互图
顺序图 Sequence diagram
强调消息的时间顺序
-
对象
-
参与者
-
消息
-
对象生存线
代表一个对象在一个时间段内的存在
-
控制焦点
长条矩形
代表一个对象直接地或通过一个子过程间接地执行一个动作的那段时间
- 嵌套
-
结构化控制(Frame、Fragment)
-
可选执行 (标签: opt)
-
条件执行 (标签:alt)
-
并行执行 (标签:par)
-
循环(迭代)执行 (标签:loop)
-
通信图 Communication diagram
强调接收和发送消息的对象的组织结构
-
对象
-
连接
-
在此连接上传递的消息
类图 -- 交互图 :建模过程是相互补充的过程!
代码与SD映射
public class Sale {
private Payment payment;
public void makePayment( Money cashTendered ) {
payment = new Payment( cashTendered );
//...
} //
...
}
活动图
概念
-
活动activity 与动作action
-
一个活动是 一个业务过程中进行的、非原子的执行单元
-
活动的执行最终延伸为一些独立动作(Action)的执行
-
动作是原子的
-
动作不能被分解
-
-
-
活动图是 顶点和弧的集合,显示从活动到活动的流
-
活动节点
-
流
-
对象值
-
注解和约束
-
-
活动节点:是活动的组织单元
-
用一个两头为圆形的方框来表示
-
可以有一个名字
-
可以是一种伪代码描述
-
放大一个活动节点,可以看到另一个活动图
-
活动节点会持续一段时间来完成
-
-
动作
-
动作是一个特别的活动节点,它不能被细分
-
在图形表示上,活动节点和动作没有区别
-
-
控制流
-
用叉箭头来表示控制流 从一个节点传到另一个节点
-
-
分支
-
用一个菱形来表示分支
-
一个分支可以有一个进入流和多个离去流
-
在每个离去流上必须设置一个监护条件!!
-
条件放在方括号里
-
条件不能重叠,以免二义性
-
可以有 [else] 分支
-
-
两个控制路径可以重新合并,无需监护条件
- 分支节点有两个输出流,布尔类型词语前缀表示不同的选择条件 - 合并节点是条件分支的结束
-
迭代可以用分支节点来实现
-
-
分岔 和 汇合 (Forking and Joining )
-
在UML中,用同步棒来说明并行控制流的分岔和汇合
同步棒是一条水平或垂直的粗线条
-
一分多,多合一
-
分岔和汇合条表示并发控制流 concurrent :
- 多重性指标指明有多少并发的行为必须被处理
-
-
泳道 Swimlanes
-
将一个活动图中的活动分组,每一组表示某个业务组织负责的活动集
-
每个组被称为一个泳道
用一条垂直的实线把它们分开
-
每个活动严格地属于一个泳道
转移可以跨越泳道
同步棒可以跨越泳道
-
泳道是包(package)的一种
- 分门别类的组织活动
-
-
对象流
-
用活动图描述某个对象时,可以把所涉及的对象放置在活动图上,并用一个依赖将这些对象连接到对它们进行创建、撤销和修改的活动转移上。
这种包括依赖关系和对象的应用被称为对象流
-
活动可以创建 对象
-
活动可以 修改对象的状态
-
-
活动节点的嵌套
- 当活动被激发或退出时,有可能包含布尔表达式
对系统的动态方面建模的五种图中之一
- 用例图活动图 / 顺序图/通信图 /状态图
一张活动图从本质上说是一个流程图,显示从活动到活动的控制流
动图中还有一类特殊的状态,用于表示活动的开始和结束
-
起始状态(start state)
-
终止状态(end state)
转移表示对象将在当前状态中执行动作,并在某个特定事件发生或某个特定的条件满足时进入后继状态。
状态图
比较:顺序图 也是对 对象的动态行为进行建模,区别何在?
- 一个是对象之间的协作 、(比较)一个是单个对象的动态行为
概念
-
考察单个实体的动态行为,从不同的视点(ViewPoint)可有不同的选择
-
状态(state)
-
是对象的生命期中的一个条件或状况
-
在此期间,对象可以响应事件、执行某活动等
-
-
状态机(state machine)
-
是一种行为,
-
说明对象在它的生命期中, 响应事件所经历的状态序列 以及它们对每个事件的响应
-
-
状态图(state diagram)
-
状态机可以用状态图来可视化。
-
状态图显示了一个状态机,它强调从状态到状态的控制流
-
-
状态无关
- 简单、独立的行为,或当前的行为并不依赖它们的过去时,不需要用一个状态机建模
-
状态依赖
-
对象的当前行为依赖于过去
- 如,手机对于按下某个按钮的反应,依赖于手机当前的状态
-
或者它的行为必须响应异步消息
-
-
状态组成
-
1)名称(name)
- 每个单词首字母大写
-
2)进入/退出动作(entry/exit action)
-
3)内部迁移(internal transition)
- Transitions that are handled without causing a change in state
-
4)子状态 (substate)
-
5)延迟事件 (deferred event)
-
-
事件
-
是对一个在时间和空间上占有一定位置的、有意义的事情的描述
-
在状态机的语境中,一个事件是一个激励的发生,它能够触发一个状态迁移
-
4种事件
-
参量变化 change event
- 布尔表达式值变化、定时器、溢出:是内部事件
-
信号 signal (异步)
-
调用 call (同步)
-
时间事件 time event
-
时间事件 是表示一段时间的推移
-
用关键字after 后面跟着时间表达式
-
用关键字at 表示某个绝对时间点上发生的时间事件
-
-
变化事件 表示状态的一个变化或某些条件得到满足的事件
- 用关键字 when后跟一个布尔表达式。当条件满足,则引发变化事件
-
-
-
-
迁移
-
A满足一定状态转移到B
-
5部分组成
-
源状态 source state
-
事件触发器 event trigger (触发事件名称)
-
触发条件 guard condition
-
效应(effect) (或称,迁移动作)
-
目标状态
-
-
特殊的迁移
-
自身迁移 self transition
- 从状态A 迁移到状态A
-
内部迁移 internal transition
- 在状态A内部 行为
-
-
图形
-
状态
-
一般状态:圆角矩形
-
初始状态:实心圆
-
结束状态:"牛眼" (bull's eye)
-
-
事件
-
触发事件名[触发条件]/迁移动作
-
这三个部分都是可以省略的,但至少有一部分
-
事件依附于表示迁移的箭线
-
-
-
迁移
- 叉形箭头实线,从初始状态指向目标状态
状态图建模注意事项
-
不允许孤立的状态存在
-
不允许只进不出的状态迁移 ("黑洞")
-
不允许只出不进的状态迁移 ("奇迹")
-
不允许没有事件发生的迁移或者"迁移" 没有指明具体的事件
状态图与交互图、活动图的比较
-
交互
-
对共同工作的 对象群体的 行为 建模
-
动态行为
-
-
状态机
-
对 单个对象的 行为 建模
-
有时,可以对单个"完整系统"的行为建模
-
说明对象在它的生命期中响应事件所 经历的状态序列以及对那些事件的 响应
-
-
动态行为建模
-
-
活动图
-
强调 从活动到活动的控制流、多个业务角色
-
状态图是强调 对象潜在的状态和这些状态之间的迁移
-
子状态机
-
子状态是嵌套在另一个状态中的状态
-
并发(正交,orthogonal)子状态
-
在一个语境中,并发地执行两个或多个状态机
-
如 '等人'和'看书'是相交的
-
-
顺序(非正交)子状态:转态不相交,一次只能处于一个子系统
-
分岔和汇合
-
分岔:从一个外部状态直接迁移到一个或多个正交状态
-
从带有正交区域的组合状态内的任一状态离开的迁移导致控制离开所有的其它正交区域
-
如,发生错误,从而迫使所有并行计算都被中断
-
-
高级类
作用域
-
实例作用域
-
类目作用域(static)
- 类图中体现为属性加下划线
抽象类
-
斜体名字
-
不会被实例化,一般是基类,他的导出类会被实例化;定义了公共的属性和方法(可以是纯虚函数)
叶子类(leaf class)是没有任何导出类的类
- 类名下加约束{leaf}
根类(root)是没有任何基类的类
- 类名下加约束{root}
- aBoy:string[1...2]=xxx{constraint}
- methodA(x:int=123):void{constraint}
特性约束
-
isQuery(query):它表明被修饰的操作是一个用于查询的操作,此操作执行结束之后不会改变类的状态
-
Sequential:
- 表明被修饰的操作在其对象内不能同时有两个以上的控制流。而这一点必须由操作的调用者来保证,对象本身不存在禁止两个控制流被同时启动的机制。 如果此操作的两个或两各以上的控制流在对象的交互中被启动,则此操作的语义和完整性将不被保证
-
guarded:
-
调用者可以同时启动此操作的多个控制流,但这些控制流被对象自身转换为顺序执行的控制流。
-
这意味着当多个控制流被同时启动时,此操作的控制流或者正常执行,或者被自我阻塞,直至没有其它控制流在正常执行为止
-
-
concurrent(并行的):操作可以有多个控制流被同时启动,且正常的控制流可以同时运行,但操作的语义和完整性仍可保证
模版类
四种标准扩充
-
《metaclass》定义类的类,它的对象是类
-
《powertype》说明一个类目。其对象是给定父类的子类
-
《stereotype》
-
《utility》
导出依赖 : 《derive》导出依赖是依赖关系的变体
-
在许多情形下,经常有一个类的两个属性是互不独立的
-
例如:有一个类Person,它代表一个人的相关信息,其中有一个属性是生日BirthDate, 另一个属性是年龄Age,
-
显然,Age是可以从BirthDate计算出的
允许《permit》:表示源从目标获得特定的可见性
约束
-
有序{order}
- 表示关联一端的对象是显示有序的
-
集合{set}
- 对象唯一,不可以重复
-
袋{bag}
- 对象不唯一,可以重复
-
有序集合{order set}
- 对象唯一且有序
-
表{list} 或序列 {sequence}
- 对象有序但可以重复
接口
接口为构件指定外部行为特征,从而能够实现软件系统的构件化,即,遵循同一个接口的构件可以互相替换
接口只能拥有操作,不能拥有属性
供接口/需接口
-
包
简单名字
- 模型包名字的字符串内不包含路径限定符(:😃
路径名字
- 名字字符串内包含有路径限定符
Active Class 主动类
是一个类,其实例是主动对象,拥有一个或者多个进程|线程
其实例可以独立运作、决定自己的行为
Active Object 主动对象
-
是一个对象,拥有一个进程、或线程,并能够启动控制活动
构件
定义了良好接口的物理实现单元,它是系统中可替换的部分
用于描述软件构件以及构件之间的组织和依赖关系
面向对象系统的物理方面建模时使用的两种图之一(另一种图是部署图)
构件和类
-
构件在许多方面都与类相同
-
二者都有名称
-
都可以实现一组接口
-
都可以参与依赖、泛化和关联关系;
-
都可以被嵌套;都可以有实例;都可以参与交互。
-
-
构件和类之间也有一些显著的差别:
-
类表示逻辑抽象,而构件表示存在于计算机中的物理抽象
-
构件表示的是物理模块而不是逻辑模块,与类处于不同的抽象级别
-
类可以直接拥有属性和操作;而一般情况下,构件仅拥有只能通过其接口访问的操作
-
端口和连接件
部署图
计算节点《processor》
设备节点《device》
对象图
描述在某一个时间点上一组对象的状态以及它们之间的关系
分析:对象图与通信图之间的异同
-
同:都是 对象之间的组织关系,都用到了 连接(Link)
-
异:
-
通信图是动态图,反映对象之间的交互,消息标签依附于连接
-
对象图是静态图,反映某一瞬间,每个对象的属性取值(状态)
-
对象图可以看作通信图在某一瞬间的快照
-
制品
制品为一个或者多个构件提供了物理承载(manifestation 表示、承载)
- 比如,一个JAR文件