文章目录
- UML概述
- 温馨提示
- 类之间的关系(6种)
- ==**依赖(Dependency)**==
- ==关联(Association)==
- ==聚集/聚合(Aggregation)==
- ==泛化(继承)(Generation| Specialization==
- ==实现(Realization)==
- ==组合(Composition)==
- 类图 (class)
- 类图的画法
- 在类图上画抽象类步骤:
- 在类上添加一个抽象方法
- 设置属性和方法为静态的
- 接口 interface
- 用例图(Use Case)
- 定义
- 用例图作用
- 用例图上的主要事物
- 参与者Actor
- 用例Use Case
- 系统边界Boundary
- 用例图中涉及的关系
- 用例之间:包含include
- 用例之间:扩展Extend关系
- 参与者之间:存在泛化(继承)关系:Generalization | Specialization
- 参与者和用例之间:存在 关联 Association 关系
- 用例图例子
- 用例规约
- 包图(Package )
- 包图上的主要构件事物
- 状态图 (State Machine)
- 定义:
- 状态图上的主要构件事物
- 画法:
- **画图操作步骤**:
- 新增图的操作:
- 部署图(Depolyment )
- 定义
- 部署图上的主要构件事物
- 案例
- 组件图(Component )
- 定义
- 种类
- 组件图上的主要构件事物
- 案例
- 顺序图|时序图(Sequence)
- 定义:
- 作用
- 准备工作:
- 顺序图上的主要构件事物
- 在顺序图上表达判断、循环等结构
- 案例
- 协作图 | 通信图 (Communication)
- 定义
- 协作图上的主要构件事物
- 案例
- 顺序图和协作图之间相互转换
- 活动图(Activity)
- 活动图上的主要构件事物
- 画图
- 案例一:
- 案例二
UML概述
Enterprise Architect(EA)
(Unified Modeling Language)统一建模语言,是一种为面向对象系统的产品进行说明、可视化和编制文档的一种标准语言。UML是面向对象设计的建模工具,独立于任何具体程序设计的语言。
软件开发生命周期:可行性研究—>需求分析—>概要设计—>详细设计—>编码—>测试—>维护
系统设计其实就是"画图纸",可用UML(图形式、图标式的语言)来画
以下采用Enterprise Architect(EA)绘图
温馨提示
Alias(别名):在消息中,别名可以用于简化操作名、属性名或变量名,从而提高图表的可读性
Stereotype(构造型):在消息中,构造型可以用于指示消息的类型、目的或重要性。
类之间的关系(6种)
6种关系又可以分为3类。
第一类,泛化。泛化表达了is a的关系模型,当A以某种形式是一个B的时候,就是这种关系,包含了有2种关系:继承、实现。
第二类,关联。关联表达了has a的关系模型,当A拥有一个B的时候,就是这种关系,包含了有3种关系:聚合、组合、关联。
第三类,依赖。依赖表达了use a的关系模型,当A使用了一个B的时候,就是这种关系,包含了1种关系:依赖。
依赖(Dependency)
-
定义:一个类A使用到了另一个类B,类B的变化会影响到类A,但是这种关系比较弱,是具有偶然性、临时性、非常弱的
-
语法:类B作为类A的方法的参数(或者局部变量)存在;A类对象需要调用B类对象的方法;A类调用了另一个B类的静态方法;就称A类依赖于B类
-
符号:一条带箭头的虚线,指向被依赖的类,即由A类指向B类的带箭头虚线表示
-
降低因为依赖关系导致的耦合度:接口分离原则
A类依赖B类, B类实现C接口,A类依赖C接口
-
下图:表达了一个物体需要通过另一个物体来完成工作,但他们之间没有包含的关系
关联(Association)
-
定义:比依赖关系强,必然的,长期的,强烈的。关联可以是双向的,也可以是单向的
-
语法:类B作为成员变量形成存在于类A中,表示类与类之间的连接,它使一个类能够知道另一个类的属性和方法
-
符号:由类A指向类B的带箭头实线
-
如下图:顾客—>订单—>商品
聚集/聚合(Aggregation)
-
定义:A类的对象是B类对象的组成部分 ,整体(A类)和部分(B类)的关系,整体和部分可分离,has a 的关系,整体和部分的生命周期不一致
-
语法:一个类作为另一个类的成员变量(同关联关系)
-
符号:一条带空心菱形的实线,部分类指向整体类,菱形在整体类(A类)这一边
-
局部对象是可以脱离整体对象而单独存在的,如:
泛化(继承)(Generation| Specialization
- 定于:类和子类的关系,接口与子接口的关系
- 语法:extends
- 符号:一条带空心三角形箭头的实线,从子类指向父类,从子接口指向父接口
实现(Realization)
-
定义:类和接口的关系,一个类可以实现多个接口
-
语法:implement
-
符号:带空心三角形的虚线,由类指向接口
-
下图的公共汽车实现交通工具接口方法
组合(Composition)
-
定义: A类和B类首先是聚合关系,A类对象和B类对象的生命周期是一致的,组合关系比聚合关系还要强,
整体和部分的关系,整体部分不可分离,contains -a 的关系
-
语法:同关联关系
-
符号:一条带实心菱形的实线,菱形在整体类这一边
-
比如:人类 心脏类
类图 (class)
类图的定义:类图是用来定义系统中的类,描述类的内部结构(属性、方法等),表示类之间的关系(泛化、实现、依赖、关联、聚合、组合)
类图主要是用来显示系统中的类、接口以及它们之间的静态结构和关系的一种静态模型。
类图的功能:类图是系统分析设计的最后成果,程序员依据类图来编码
-
类图上的主要构件事物:
类名称:学生
类属性:#:代表protected —:代表private +:代表公有
类方法
类图的画法
在类图上画抽象类步骤:
-
在类图上画一个类,输入类名 —> 在类的图例上双击 —> 在属性上选择“Details”选项卡 —> 在选项卡上勾选 Abstract 复选框 —> 确定
-
抽象类的类名是斜体字
在类上添加一个抽象方法
-
右击类的图例 —> 在快捷菜单上选择 “Features”—“Operations”—> 在弹出的对话框下面的表格中输入方法的信息:方法名 Name;形参 Parameter ;返回值类型 Return Type ;访问修饰符 Scope —> 在对话框右边的属性Properties表格中 将Abstract 设置为 True
-
抽象方法的方法名是斜体字
设置属性和方法为静态的
- 右击类的图例 —> 在快捷菜单上选择 “Features”—“Operations”—> 在弹出的对话框下面的表格中输入方法的信息:方法名 Name; 形参 Parameter ;返回值类型 Return Type; 访问修饰符 Scope —> 在对话框右边的属性Properties表格中 将Static设置为 True
- 静态的成员下方有下划线
接口 interface
- 接口也是方框,不过接口名上方有构造型:《interface》
用例图(Use Case)
定义
- 用例图是指由参与者、用例、边界、以及他们之间的关系用于描述系统功能的视图
用例图作用
在软件生命周期:可行性研究 需求分析 概要系统分析与设计 详细系统分析与设计 编码实现 测试
用例图:用来描述系统功能
用例图上的主要事物
参与者Actor
位于系统的外部,和软件系统有交互的人或者事物
- 如何识别参与者
- 为系统提供输入的人或事物
- 接收系统输出的人或事物
- 需要接入的第三方系统或设备
- 时间是否会触发某些事件
- 负责支持或维护系统中信息的人
用例Use Case
用例就是参与者提出来的要求实现的功能
系统边界Boundary
就是一个大方框,表示软件系统的边界,边界内容就是软件必须实现的,边界外部就不需要写代码来实现
用例图中涉及的关系
包含、扩展、泛化、关联
用例之间:包含include
网络商店系统:用户登录(A) 账号密码登录 (B) 微信登录 (B)
没有B用例,A用例是不完整的;B用例是必不可少的
A用例称之为基用例,B用例称之为包含用例
用例之间:扩展Extend关系
图书馆管理系统:归还图书(A) 缴纳罚金(B)
A用例是B用例执行的前提;
没有B用例,A用例是完整的;B用例不是必不可少的
B用例是A用例执行过程中满足某些条件才执行的
A用例是基用例,B用例称之为扩展用例
参与者之间:存在泛化(继承)关系:Generalization | Specialization
A参与者是B参与者中的一种
例如: 人力资源管理系统HRM : 职工 总经理
符号:带空心三角形的实线,三角形指向父类
参与者和用例之间:存在 关联 Association 关系
参与者可以发起功能
用例图例子
用例规约
1、禁止使用软件专业术语
2、基本事件流只写正确执行的主要事件流,不正确的流程写在分支事件流
用例名称 | 用户登录 | |
---|---|---|
参与者 | 读者、学生、老师 | |
用例简述 | 图书馆的各种读者通过用户登录获取其在系统中的合法身份 | |
前置条件 | 已经注册了读者身份 | |
基本事件流 | 用户操作 1、用户要求进行用户登录 3、用户在登录界面上输入账号、密码数据,并提交 | 系统反应 2、系统显示登录界面 4、系统验证账号是否存在,密码是否正确,系统记录登录成功的用户的数据;系统显示主界面 |
分支事件流(n) | 在基本事件流第4步发现账号不存在或者密码错误,进入分支事件流 回到基本事件流第3步 | 系统再一次显示登录界面,界面上显示上一次的错误原因 |
后置条件 | 系统记录用户信息,修改用户的状态 |
包图(Package )
在系统概要分析设计阶段,描述系统的体系结构
包图上的主要构件事物
-
包:代表子系统、模块、组件等软件组成部分的集合体
文件夹图案
-
包之间的关系:
包之间存在包含关系:Nesting :
1> 先画父包,在父包中直接画子包
2> 先画两个包,从子包画线(表示关系),选择Nesting
-
包之间还可以存在:Dependency依赖关系 Realization实现关系 Import导入关系
状态图 (State Machine)
定义:
在系统详细分析与设计阶段,针对系统较核心的对象,分析其生命周期中可能的状态以及状态之间的转移和转移条件,绘制成状态图。
更深入的理解系统中的核心对象以及系统本身
- 状态图用来描述一个特定的对象所有的可能状态,以及哪些事件将导致状态改变
状态图上的主要构件事物
- 箭头:表述一个转换/一个动作
- 箭头上的文字表示:一个事件
- 长方形表示某种状态
- 起始状态:是一种伪状态(即实际上不存在),只是表示从这里要开始 Initial
- 结束状态:是一种伪状态,只是表示从这里要结束 Final
画法:
示例:画出酒店管理系统中的客房的状态图
分析:
开始状态 结束状态
可使用状态(没有住人)
已住状态
预订状态
维修状态
画图操作步骤:
- 在Model根节点上添加状态图模型:
右击Model根节点 —> Add a Model using Wizard 使用想到添加新模型
—> Model Wizard —> State Machine选择一个模型 —> Create pattern
- 画状态图:
-
放置Initial开始状态和Final结束状态
-
放置其他状态State
-
画状态之间的转移transition
-
一般initial、final和一般状态之间的转移不需要写转移条件
-
状态之间的转移条件一般有两种:
- 对象执行某个动作导致状态转移,动作写到Triggers
- 系统监察某个条件,条件发生变化导致状态转移,
-
条件文字写到Guard里
新增图的操作:
-
在对应的模型上右击 —> “Add Diagram添加图”
-
在新图对话框中,Diagram文本框中填写图的名称,
下方右边选择类型:UML Structral :静态图 右边选择图的类型 :Class类图
Package包图 Component组件图 Depolyment 部署图
UML Behaviour:动态图 Use Case用例图 Sequence顺序图
Communication协作图
Activity活动图 State Machine状态图
部署图(Depolyment )
定义
系统概要分析与设计阶段,使用部署图来描述系统安装在哪些设备上,设备之间存在的关系。
设备必须有计算能力或者存储能力的。
计算机 服务器 客户端 打印机 键盘 路由器 交换机 调制解调器
部署图上的主要构件事物
-
节点 node,描述设备,形状是一个立方体
节点之间的关联关系Association(两个节点之间存在通信)
-
一般描述:
- 三层结构:用户界面组件 业务逻辑组件 数据访问组件 实体组件 数据库组件
- 单体:在一台计算机上安装软件的所有组件
- 服务器集群
案例
组件图(Component )
定义
系统概要分析与设计阶段,使用组件图来描述系统中的文件(组件) 以及组件之间的关系。
种类
- 工作产品组件图(开发阶段,对源代码文件等建模)
- 部署部件图(对编译打包后的文件建模)
组件图上的主要构件事物
-
组件:component,对应一个文件
-
接口:expose interface
组件向外提供的服务或者组件需要导入的服务
-
分为两种:1. 导出接口,组件向外提供的服务 2. 导入接口,组件需要从别的组件导入的服务
-
组件和组件的导出接口之间的关系称之为 实现
-
组件和组件的导入接口之间的关系是 依赖
-
-
关系:依赖关系
案例
顺序图|时序图(Sequence)
定义:
-
顺序图:表达一个用例的具体的实现过程。强调的就是时间先后顺序
-
是一种UML交互图,当用户进行某个操作的时候,按照时间的顺序看,各个模块之间如何调用的,描述了方法的调用过程,程序的执行流程以及方法执行结束的返回值情况。所以用例图中的一个用例会对应一个时序图,该时序图描述的是该功能/用例具体是怎么实现的流程是什么,严格情况下,肯定是先设计再开发。
作用
-
用例图:需求分析
-
类图:系统分析设计 静态建模
-
顺序图:系统分析设计 动态建模
准备工作:
用例图、用例规约(活动图)
系统架构 包图
类图
顺序图上的主要构件事物
参与者、类|对象、生命线|时间线、消息(方法调用)
在顺序图上表达判断、循环等结构
一、 在图上添加 “Fragment”片段
二、 设置Fragment片段的属性:双击Fragment片段,在弹出的窗口中设置以下属性
Type类型:Alt判断 Loop循环 Condition条件
三、 在Fragment片段的矩形中画消息,这些消息就是满足条件才执行的消息或者是满足条件循环发送的消息
案例
画图的时候注意:
-
直接点击箭头拖拽,便可形成连接线。
-
在连接线上写文字,需要双击连线,会出现一个ConnectorProperty方框,在方框里的message栏写上消息信息即可
画出用户登录的顺序图
三层结构:用户界面类,业务逻辑类、数据访问类、实体类
协作图 | 通信图 (Communication)
定义
协作图和顺序图一样,描述一个功能的实现过程
顺序图强调消息的时间先后顺序,协作图强调的是系统的整体结构
协作图上的主要构件事物
-
参与者
-
类 | 对象
-
消息 :前缀:守卫条件:序列表达式:返回值 := 消息名(参数) (只有 消息名(参数) 部分是必须的)
-
前缀:表示消息发生的先后顺序,如 1,2,3,… 1.1 1.2 1.3
-
守卫条件:表示判断的条件,如 [x>0]
-
序列表达式:表示循环,如 *[x>0] *[所有学生]
案例
客户乘坐电梯的协作图:
顺序图和协作图之间相互转换
下图中获取长度队列消息前可以像协作图一样添加序列表达式,这样,表示循环的Fragment片段就可以去掉。
活动图(Activity)
- 在需求分析阶段,用例的业务流程使用活动图表述 流程非常清晰
用例规约:表达仔细精确
- 在编码实现阶段,用活动图表述一个方法的实现流程
活动图上的主要构件事物
- Action : 动作《===》流程图上的步骤,表达的就是流程中的一个处理步骤
不可细分
-
Activity: 动作
-
Initial: 开始动作,每张活动图必须有一个initial
-
Final:结束动作,每张活动图上至少有一个Final
-
Decision:判断条件是true还是false,选择其中一条子流程来执行
-
Partition:泳道,一条泳道就分配给一个角色,角色的总做画在自己的泳道中
-
分支:根据条件选择两条子流程中的一条来执行
分叉:fork|join分叉中有2条或者2条以上的子流程,
所有的子流程都要执行;所有子流程的执行具有并行执行的特点
即分支是true/false条件分支,分叉是并发进行
画图
画图时,initial和activity之间,activity与activity之间,Final和activity之间选择ControlFlow连线
使用EA画活动图、用例图、及序列图_ea活动图怎么创建-CSDN博客
案例一:
画出学生请假的活动图
学生填写请假单 ===> 班主任审批 => (请假时间>1天)学工处审批=>
学工处记录 ===> 班主任通知学生请假结果
1> 无脑画initial和final开始和结束
2> 依赖画Action动作
3> 使用ControlFlow连接所有动作
但是不能很直观的表达流程中每个角色的职责
所以改进:
案例二
卖家接收到买家的订单后处理订单的业务流程:
财务部收款 开具发票
仓储部备货 发物流