为什么会把UML放在设计模式这里呢,因为一般设计模式基本都会涉及到类图。
1.概述
UML是当今世界上软件设计的标准图标式设计语言
统一建模语言UML是OMG(object management group)在1997年发表的图标式软件设计语言,综合了当时很多已经存在的面向对象的建模语言、方法和过程。
2.具备的功能
-
可视化功能
优点
可以促进对问题的理解还有解决.
方便熟悉UML的软件设计师彼此沟通和交流.
比较容易发现设计图中的错误,减少错误的发生
-
说明功能
对一个系统的整体起到说明的作用,UML具备通用的,精确的,没有歧义的通信机制,可以起到很好的说明作用。
建造功能
-
建文档功能
使用UML进行设计的同时可以产生系统文档。
3.类型
UML包括一下的图
<u style="box-sizing: border-box;">案例图</u>
<u style="box-sizing: border-box;">类图</u>
<u style="box-sizing: border-box;">序列图</u>
合作图
状态图
活动图
构件图
部署图
分类
按照这些图的用意,还可以分为结构形图和行为型图两种。
结构型图
描述了系统的静态结构,在显示一个已有的类以及他们之间的静态关系的时候最为有用。
列表
图的名字 | 介绍 |
---|---|
类图 | 类图描述一些类、包的静态结构以及他们之间的静态关系 |
对象图 | 对象图给出一个系统中对象的快照 |
构件图 | 描述可以部署软件构件(比如jar文件、EJB)之间的静态关系 |
部署图 | 描述一个系统的拓扑结构 |
行为型图
描述一个系统的动态性质,在显示系统的元素如何产生满足要求的系统行为方面最为有效。
列表
图 | 介绍 |
---|---|
案例图 | 使用案例图描述一系列的角色和使用案例及他们之间的关系,可以对系统最基本的行为进行建模。 |
活动图 | 描述不同过程间的动态接触 |
状态图 | 描述一系列的内部对象状态及状态的变化和转移,注意一个类不能有两个不同的状态图 |
时序图 | 时序图是一个相互作用图,描述不同对象之间信息传递的时许 |
合作图 | 合作图是一种相互作用图,描述付出消息、接受消息的一系列对象的组织结构 |
要描述一个设计模式的行为特性,使用状态图和时序图比较合适。
只要有意义,所有的图,可以混合一起使用。
在设计结构中,类图、状态图、序列图是最常见的图。
应该指出,一个使用UML的系统设计,往往是以一个案例图开始驱动的,而且一个设计也应该以使用案例驱动。
类图
类图属于结构性图,是显示出类、接口、父类以及他们之间的静态结构和关系的图。
泛化(generalization):表示is-a的关系,是对象之间耦合度最大的一种关系,子类继承父类的所有细节。直接使用语言中的继承表达。在类图中使用带三角箭头的实线表示,箭头从子类指向父类。
实现(Realization):在类图中就是接口和实现的关系。这个没什么好讲的。在类图中使用带三角箭头的虚线表示,箭头从实现类指向接口。
依赖(Dependency):对象之间最弱的一种关联方式,是临时性的关联。代码中一般指由局部变量、函数参数、返回值建立的对于其他对象的调用关系以及对静态方法的调用。一个类调用被依赖类中的某些方法而得以完成这个类的一些职责。在类图使用带箭头的虚线表示,箭头从使用类指向被依赖的类。
关联(Association) : 对象之间一种引用关系,比如客户类与订单类之间的关系。这种关系通常使用类的属性表达。关联又分为一般关联、聚合关联与组合关联。后两种在后面分析。在类图使用带箭头的实线表示,箭头从使用类指向被关联的类。可以是单向和双向,也可以没有箭头。
聚合(Aggregation) : 表示has-a的关系,是一种不稳定的包含关系。较强于一般关联,有整体与局部的关系,并且没有了整体,局部也可单独存在。如公司和员工的关系,公司包含员工,但如果公司倒闭,员工依然可以换公司。在类图使用空心的菱形表示,菱形从局部指向整体。
组合(Composition) : 表示contains-a的关系,是一种强烈的包含关系。组合类负责被组合类的生命周期。是一种更强的聚合关系。部分不能脱离整体存在。如公司和部门的关系,没有了公司,部门也不能存在了;调查问卷中问题和选项的关系;订单和订单选项的关系。在类图使用实心的菱形表示,菱形从局部指向整体。
多重性(Multiplicity) : 通常在关联、聚合、组合中使用。就是代表有多少个关联对象存在。使用数字..星号(数字)表示。如下图,一个割接通知可以关联0个到N个故障单。
聚合和组合的区别
这两个比较难理解,重点说一下。聚合和组合的区别在于:聚合关系是“has-a”关系,组合关系是“contains-a”关系;聚合关系表示整体与部分的关系比较弱,而组合比较强;聚合关系中代表部分事物的对象与代表聚合事物的对象的生存期无关,一旦删除了聚合对象不一定就删除了代表部分事物的对象。组合中一旦删除了组合对象,同时也就删除了代表部分事物的对象。
时序图
UML时序图,又叫序列图或者顺序图,是一种用来描述对象之间传送消息的时间顺序,是用来表示用例中的行为顺序。
UML时序图基本的符号即含义:
1、对象:表示系统的参与者或者任何有效的系统对象。
对象位于时序图的顶部,以一个矩形表示。对象的命名方式一般有三种: 1 对象名和类名。例如:华为手机:手机、loginServiceObject:LoginService。 2 只显示类名,不显示对象,即为一个匿名类。例如::手机、:LoginSservice。
3 只显示对象名,不显示类名。例如:华为手机:、loginServiceObject:
2、生命线:相当于一个时间线,表示对象在一段时间内的存在时间,而且从时序图的顶部一直延伸至底部,长度取决于交互的时间。
3、消息:是用来表示一个对象向其他一个或者多个对象发送信号,或者由一个对象调用另外一个对象的操作。
表现代表对象之间发送的信息。消息分为三种类型。 同步消息(Synchronous Message) 消息的发送者把控制传递给消息的接收者,然后停止活动,等待消息的接收者放弃或者返回控制。用来表示同步的意义。以一条实线+实心箭头表示。 异步消息(Asynchronous Message) 消息发送者通过消息把信号传递给消息的接收者,然后继续自己的活动,不等待接受者返回消息或者控制。异步消息的接收者和发送者是并发工作的。以一条实线+大于号表示。 返回消息(Return Message) 返回消息表示从过程调用返回。以小于号+虚线表示
4、激活:表示的是一个对象直接或者通过从属操作而完成操作的过程。在时序图中一般激活符号的顶端与激活时间对齐,低端与完成时间对齐,被执行的操作则用文字进行标识。
5、注释:是用来对UML实体进行文字描述的。
6、约束:表示的是当为对象交互建模时,有时候必须满足一个条件,消息才会传递给对象。
7、用户:即系统角色,可以是人、其他系统或者子系统。
8、链接到自己:显示对象可以调用自己的属性。
9、通信:表示创建对象之间的通信路径。
10、包:在UML中,一个包直接对应的是一个Java中的包,是一种常规用途的组合机制。
状态图(暂时不须深入)
状态(state)是指在对象的生命期中的某个条件或状况,在此期间对象将满足某些条件、执行某些活动或等待某些事件。所有对象都具有状态,状态是对象执行了一系列活动的结果,当某个事件发生后,对象的状态发生变化。
状态图(statechart diagram): 用来描述一个特定的对象所有可能的状态,以及由于各种事件的发生而引起的状态之间的转移和变化。 并不是所有的类都需要画状态图,有明确意义的状态,在不同状态下行为有所不同的类才需要画状态图。如下, 一个机器的状态图
再如,CD Player的状态图
1.状态 一个状态有以下几个部分:状态名(name)、进入/退出动作(entry/exit action)、内部转移(internal transttion)、子状态(substate)、延迟事件(dferred event)。 状态可以细分为不同的类型,例如初态、终态、中间状态、组合状态、历史状态等。一个状态图只能有一个初态,但终态可以有一个或多个,也可以没有终态。 中间状态包括两个区域:名字域和内部转移域,如图所示。其中内部转移域是可选的。
横线上面是名字域,下面是转换域(可选)。
ntry/turnOn:当转入该状态时,做开灯动作。 do/blinkFivetimes:当处于该状态时,灯闪烁5次。do活动是只在状态内出现的活动,不能附加到转换上。 event poweroff/powerSupplySelf:当电源关闭事件发生时,用自备电源。 exit/turnOff:当转出该状态时,做关灯动作。 event selfTest/defer:当selfTest事件发生时,对象将延迟响应,到别的状态中再处理,用defer这个特定动作表示延迟。
2.状态图的要素
椭圆或圆角矩形:表示对象的一种状态,椭圆内部填写状态名 箭头:表示从箭头出发的状态可以转换到箭头指向的状态 事件:引起状态转换的原因。事件名可在箭头线上方标出 条件:事件名后加方括号,括号内写状态转换条件 实心圆:初始状态 内部实心的同心圆:最终状态
3.状态的类型
①按状态过程分:
②含有子状态的状态被称为组合或嵌套状态
组合状态可以使用“与”关系分解为并发子状态,或者通过“或”关系分解为互相排斥的顺序子状态。两种表示方法: 顺序子状态 如果一个组成状态的子状态对应的对象在其生命期内的任何时刻都只能处于一个子状态,即多个子状态之间是互斥的,不能同时存在,这种子状态称为顺序子状态。
并发子状态 有时组合状态有两个或者多个并发的子状态机,此时称组成状态的子状态为并发子状态。③历史状态是伪状态, 其目的是记住从组合状态中退出时所处的子状态, 当再次进入组合状态时, 可以直接进入这个子状态, 而不是再从组合状态的初态开始。
浅(shallow)历史状态, 只记住最外层组合状态的历史。 深(deep)历史状态, 可以记住任意深度的组合状态的历史。
CD Player,running状态被打断到power on状态,再转回到running状态时,希望直接进入历史状态
4.转移(Transition)转移是两个状态间的一种关系,表示对象将在当前状态中执行动作,并在某个特定事件发生或某个特定的条件满足时进入后继状态。 每个转移只允许有一个事件触发,一个事件只允许有一个动作。
①转移的五要素(注意格式)
格式:事件(参数)[条件]/动作 ▪源状态 ▪目标状态 ▪触发事件 -如果箭头上不带任何事件名,表示是一个自动转换,当与源状态相关的活动完成时就会自动触发。 ▪监护条件 ▪动作
②转换的类型
内部转移:不导致状态改变的转移,不会执行entry和exit动作
外部转移 自转移5.事件(Event) 事件是对一个时间和空间上占有一定位置的有意义的事情的规格说明。事件触发状态的转移。
四类主要事件: ▪信号事件 ▪调用事件 ▪变化事件 ▪时间事件
①信号signer事件对象之间通过发送信号和接收信号实现通信。信号是一种异步机制。在计算机中,鼠标和键盘的操作均属于此类事件。对于一个信号而言,对象一般都有相应的事件处理器,如onMouseClick()等。
②调用call事件 表示一个操作的调度。一个对象请求调用另一个对象的操作 信号是一个异步事件,而调用事件一般是同步的。也就是说,当对象调用另一对象的操作时,控制就从发送者传送到接收者,该事件触发转换,完成操作后,接收者转换到一个新的状态,控制返还给发送者。
③变化change事件用关键字When,后面跟布尔表达式 When(temperature>120)/alerm() 变化事件的意图是要频繁测试表达式,只要表达式由假变为真,事件就会发生。
注意: 变化事件与监护条件的区别
④时间(time)事件 时间事件是指在绝对时间或在某个时间间隔内发生的事情所引起的事件。 例如到达某一时间或经过了某一时间段。用关键字When 或After表示。
6.状态图建模技术
建模步骤: ①找出适合用模型描述其行为的类。 ②确定对象可能存在的状态。 ③确定引起状态转换的事件。 ④确定转换进行时对象执行的相应动作。 ⑤对建模的结果进行相应的精化和细化。
感谢您阅读我的文章,如果满意可以帮我点个赞,谢谢哈。
如果对文章部分还有什么见解或者疑惑,可以私信评论我,欢迎技术讨论。如果需要获取完整的文件资源,可以加我微信z985085305,获取我整理的全套笔记。
思想的碰撞最能促进技术的进步哦。