UML
UML:统一建模语言(Unified Modeling Language)。在 UML 系统开发中有三个主要的模型:
- 功能模型:从用户的角度展示系统的功能,包括用例图。
- 对象模型:采用对象,属性,操作,关联等概念展示系统的结构和基础,包括类图、对象图、包图。
- 动态模型:展现系统的内部行为。包括时序图,活动图,状态图。
以下主要总结开发过程中常用的类图和时序图,及类之间的各种关系。
类图
类图使用类来描述系统的静态结构,类图包含类和它们之间的关系,它描述系统内所声明的类,但它没有描述系统运行时类的行为。
在UML类图中,类一般由三部分组成:
- 类名:每个类都必须有一个名字,类名是一个字符串。
- 属性(Attributes):属性是指类的性质,即类的成员变量。类可以有任意多个属性,也可以没有属性。
- 操作(Operations):操作是类的任意一个实例对象都可以使用的行为,操作是类的成员方法。
类之间的关系
关联关系
关联关系(Association)是类与类之间最常用的一种关系,它是一种结构化关系,用于表示一个类对象与另一个类对象之间有联系。
在 UML 类图中,用实线连接有关联的对象所对应的类。在实现关联关系时,通常将一个类的对象作为另一个类的属性。
单向关联
类的关联关系可以是单向的,单向关联用带箭头的实线表示。
public class Customer { private Address address; …… } public class Address { …… }
双向关联
默认情况下,关联是双向的。
public class Customer { private Product[] products; …… } public class Product { private Customer customer; …… }
自关联
在系统中可能会存在一些类的属性对象类型为该类本身,这种特殊的关联关系称为自关联。
重数性关联
重数性关联关系又称为多重性关联关系(Multiplicity),表示一个类的对象与另一个类的对象连接的个数。在 UML 中多重性关系可以直接在关联直线上增加一个数字表示与之对应的另一个类的对象的个数。
表示方式 | 多重性说明 |
---|---|
1..1 | 表示另一个类的一个对象只与一个该类对象有关系 |
0..* | 表示另一个类的一个对象与零个或多个该类对象有关系 |
1..* | 表示另一个类的一个对象与一个或多个该类对象有关系 |
0..1 | 表示另一个类的一个对象没有或只与一个该类对象有关系 |
m..n | 表示另一个类的一个对象与最少m、最多n个该类对象有关系 (m<=n) |
聚合关系
聚合关系(Aggregation)表示一个整体与部分的关系。通常在定义一个整体类后,再去找出这个整体类的一些成员类,该整体类和成员类之间就形成了聚合关系。
在聚合关系中,成员类是整体类的一部分,即成员对象是整体对象的一部分,但是成员对象可以脱离整体对象独立存在。在 UML 中,聚合关系用带空心菱形的直线表示。
public class Car { private Engine engine; public Car(Engine engine) { this.engine = engine; } public void setEngine(Engine engine) { this.engine = engine; } …… } public class Engine { …… }
组合关系
组合关系(Composition)也表示类之间整体和部分的关系,但是组合关系中部分和整体具有统一的生存期。一旦整体对象不存在,部分对象也将不存在,部分对象与整体对象之间具有同生共死的关系。
在组合关系中,成员类是整体类的一部分,而且整体类可以控制成员类的生命周期,即成员类的存在依赖于整体类。在UML中,组合关系用带实心菱形的直线表示。
public class Head { private Mouth mouth; public Head() { mouth = new Mouth(); } …… } public class Mouth { …… }
依赖关系
依赖关系(Dependency)是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在需要表示一个事物使用另一个事物时使用依赖关系。大多数情况下,依赖关系体现在某个类的方法使用另一个类的对象作为参数。
在UML中,依赖关系用带箭头的虚线表示,由依赖的一方指向被依赖的一方。
public class Driver { public void drive(Car car) { car.move(); } …… } public class Car { public void move() { ...... } …… }
泛化关系
泛化关系(Generalization)也就是继承关系,也称为“is-a-kind-of”关系,泛化关系用于描述父类与子类之间的关系,父类又称作基类或超类,子类又称作派生类。在 UML 中,泛化关系用带空心三角形的直线来表示。
实现关系
实现关系(Realization)是类实现了接口,类中的操作实现了接口中所声明的操作。在UML中,类与接口之间的实现关系用带空心三角形的虚线来表示。
时序图
时序图用于表示对象之间的交互,重点表示对象之间发送消息的时间顺序。它以图形化的方式描述了在一个用例或操作的执行过程中对象如何通过消息相互交互,说明了消息如何在对象之间被发送和接收以及发送的顺序。时序图允许直观地表示出对象的生存期,在生存期内,对象可以对输入消息做出响应,还可以发送信息。
一个复杂的时序图可以划分为几个小块,每一个小块称为一个交互片段(Interaction Fragment)。每个交互片段由一个大方框包围,在方框左上角的间隔区内标注该交互片段的操作类型,该操作类型用操作符表示,常用的操作符包括:
- alt:多条路径,条件为真时执行。
- opt:任选,仅当条件为真时执行。
- par:并行,每一片段都并发执行。
- loop:循环,片段可多次执行。
StarUML
开发过程中需要绘制类图和时序图,常用的软件有:StarUML,PowerDesigner 等,在线的有:ProcessOn。这里介绍一下 StarUML的使用技巧。
类之间的关系
在绘制类之间的关系时,对应 UML 的工具如下图所示:
其中实现的关系,要达到带空心三角形的虚线表示,则不要使用这个 Interface Realization,而应该在 Composite Structure 目录下找到 Realization 的工具。
时序图
序列图主要用于展示对象之间交互的顺序,是一种强调消息时序的交互图,由对象(Object)、消息(Message)、生命线(Lifeline)和Combined Fragments组成,它主要描述系统中对象和对象之间的交互,它将这些交互建模成消息交换。
时序图将交互关系展示成了一个平面二维图,其中纵向标示时间轴,时间沿竖线从上向下进行。横向轴标示了交互中各各个对象。对象的的用生命线表示。消息从一个对象的生命线到另一个对象生命线的箭头表示,箭头以时间顺序在图中从上到下排列,从左到右排列。
对象(Object)和生命线(Lifeline)
生命线头上那个方正的框里面存放的就是对象,对象有自己的名字,生命线其实就是从上到下的一个虚线。生命线标示一个对象存在的生命周期,两条生命线中间通过消息连接起来,
消息(Message)
消息用于对象间传递信息,对象之间的信息�互通就是通过消息,消息按照分类可分为:同步消息(Synchronous Message),异步消息(Asynchronous Message)和返回消息(Return Message) 自关联消息(Self-Message)
- 同步消息:发送消息的对象在发送消息后会挂住,等消息接受对象接受消息返回后才会解除挂住的状态继续自己的工作。
- 异步消息:发送消息的对象在发送消息后会继续自己的工作,而不等消息接受对象接受消息返回。
- 返回消息:标示发送消息后返回的动作
- 自关联消息:一个对象内自调用的情况。
注释
约束
约束的符号很简单;格式是: [Boolean Test]
复杂时序图
在绘制时序图的时候,会遇上选择,循环等复杂的表示,StarUML 可以利用组合片段来完成。
组合片段 Combined Fragment
组合片段 用来解决交互执行的条件及方式。
它允许在序列图中直接表示逻辑组件,用于通过指定条件或子进程的应用区域,为任何生命线的任何部分定义特殊条件和子进程。
左侧选择 Toolbox -> Interactions(Advanced) -> Combined Fragment
后,在sequence diagram 任意区域单击即可添加。
add Operand: 选中Combined Fragment后,单击回车键,出现的add Operand icon。
CombinedFragment 有12种 互动操作符interaction Operator,可以通过Editors -> Properties -> interactionOperator
选择。
1.loop:
当没有指定循环边界默认范围为[0,无穷大]:
如果只指定了一个值,那么默认执行该值次数:
指定了循环边界,则最少执行最小值值,最多执行最大值次数:
实现dowhile方式,至少执行一次,如果size<0则退出:
2. alt:
条件判断,如果n>0则执行agree函数否者执行reject函数
3. opt:
switch,当满足不同条件执行不同方法:
4. break:
n=10时候执行save并退出循环
5. par:
同时进行,比如多个线程同时执行任务
一个例子
- Alternative fragment(denoted “alt”) 标示 if…then…else
- Option fragment (denoted “opt”) 标示Switch
- Parallel fragment (denoted “par”) 标示同时发生
- Loop fragment(denoted “loop”) 标示for
- Break标示退出循环
interactionOperator | name | description |
---|---|---|
alt | 抉择 | 包含一个片段列表,这些片段包含备选消息序列。 在任何场合下只发生一个序列。 可以在每个片段中设置一个临界来指示该片段可以运行的条件。 else 的临界指示其他任何临界都不为 True 时应运行的片段。 如果所有临界都为 False 并且没有 else,则不执行任何片段。 |
opt | 选项 | 包含一个可能发生或可能不发生的序列。 可以在临界中指定序列发生的条件。 |
par | 并行 | 并行处理。 片段中的事件可以交错。 |
loop | 循环 | 片段重复一定次数。 可以在临界中指示片段重复的条件。Loop 组合片段具有“Min”和“Max”属性,它们指示片段可以重复的最小和最大次数。 默认值是无限制。 |
critical | 关键 | 用在 Par 或 Seq 片段中。 指示此片段中的消息不得与其他消息交错。 |
strict | 强顺序 | 有两个或更多操作数片段。 这些片段必须按给定顺序发生。 |
seq | 弱顺序 | 有两个或更多操作数片段。 涉及同一生命线的消息必须以片段的顺序发生。 如果消息涉及的生命线不同,来自不同片段的消息可能会并行交错。 |
break | 中断 | 如果执行此片段,则放弃序列的其余部分。 可以使用临界来指示发生中断的条件。 |
默认情况下,序列图表明可能发生的一系列消息。 在运行的系统中,可能会出现您未选择显示在关系图上的其他消息。
以下片段类型可用于更改此释义:
interactionOperator | name | description |
---|---|---|
neg | 否定 | 此片段中显示的序列不得发生。 通常用在 Consider 或 Ignore 片段中。 |
assert | 断言 | 操作数片段指定唯一有效的序列。 通常用在 Consider 或 Ignore 片段中。 |
ignore | 忽略 | 此片段未描述的消息列表。 这些消息可发生在运行的系统中,但对此描述来说意义不大。 在“Messages”属性中键入该列表。 |
consider | 考虑 | 指定此片段描述的消息列表。 其他消息可发生在运行的系统中,但对此描述来说意义不大。 在“Messages”属性中键入该列表。 |
显示/隐藏序列号
隐藏序列号 状态:
显示序列号 状态:
具体操作
sequence diagram选中视图,选择右下角Editors -> Properties -> showSequenceNumber
,可以显示/隐藏序列号。
今天的文章 StarUML画类图、时序图的使用指南分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/83313.html