UML及软件建模课件_第1页
UML及软件建模课件_第2页
UML及软件建模课件_第3页
UML及软件建模课件_第4页
UML及软件建模课件_第5页
已阅读5页,还剩325页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

UML及软件建模UML(UnifiedModelingLanguage,统一建模语言)是一种可视化的建模语言,它能够让系统构造者用标准的、易于理解的方式建立起能够表达他们设计思想的系统蓝图,并且提供一种机制,以便于不同的人之间有效的共享和交流设计成果。1、UML是一种语言UML是什么?2、UML是一种可视化的语言3、UML是一种可以用于详细描述的语言4、UML是一种构造语言UML有什么用处?一个成功的开发项目之所以成功,是因为功能的提出者(客户)和实现功能的开发人员(程序员)之间有有一座可以很好沟通的桥梁。UML借助一套图形和符号,可以来完成这座桥梁的作用。UML不是一门程序设计语言。但可以使用代码生成器工具将UML模型转换为多种程序设计语言代码,或使用反向生成器工具将程序源代码转换为UML。UML不是一种可用于定理证明的高度形式化的语言,这样的语言有很多种,但它们通用性较差,不易理解和使用。

UML是一种通用建模语言。对于一些专门领域,例如用户图形界面(GUI)设计、超大规模集成电路(VLSI)设计、基于规则的人工智能领域,使用专门的语言和工具可能会更适合些。

UML是一种离散的建模语言,不适合对诸如工程和物理学领域中的连续系统建模。它是一个综合的通用建模语言,适合对诸如由计算机软件、固件或数字逻辑构成的离散系统建模。UML用在系统设计的哪一个阶段?

软件设计几个主要的阶段:需求分析概要设计详细设计编码测试结构化的需求分析方式和设计方式例如:数据流图等面向对象的需求分析方式和设计方式结构化程序设计语言:C等面向对象的程序设计语言:C++,JAVA等结构化测试方法面向对象的测试方法例如:UMLUML的历史UML的组成

构造块公共机制构架建模元素关系图UML修饰公共分类规格说明扩展机制五个系统视图支持UML开发的常用工具PowerDesigner(Sybase)Rose(Rational)Together(Borland)Visio(Microsoft)BridgePoint(ProjectTechnology)VisualUML(VisualObjectModelers)

建模

建模的定义:建模是对现实的简化。就是把复杂的系统变成小的系统,采用“各个击破”的原则逐一解决。

为什么要建模建立大厦和建立茅草屋的区别是建设茅草屋不需要设计。要生产合格的软件就要有一套关于体系结构、过程和工具的规范。

建模的目标

1)模型帮助我们按照实际情况或按照我们所需要的样式对系统进行可视化。

2)模型允许我们详细说明系统的结构和行为。

3)模型给出一个知道我们构造系统的模板。

4)模型对我们的决策进行文档化。建模的误区无论你遵从的是重量级的方法,比如EnterpriseUnifiedProcess(EUP),还是轻量级的开发过程,如ExtremeProgramming(XP),建模在软件开发中都是不可或缺的。但不幸的是其中充斥着各种谬误与迷思。这来自于各个方面,有从理论家错误的研究、数十年来信息技术领域内的文化沉积、软件工具开发商天花乱坠半的市场宣传以及象ObjectManagementGroup(OMG)和IEEE这类组织的标准误区一:建模就等于是写文档

事实分析:“模型”与“文档”这二者在概念上是风马牛不相及的----你可以拥有一个不是文档的模型和不是模型的文档。建模很象是作计划:作计划的价值在于计划编制的过程中而非计划本身;价值体现在建模的活动中,而非模型本身实际上,模型不是你系统中的一部分正式的文档,而且在完成它们的使命后可以被丢掉。你会发现值得保留的只有很少的模型,而且它一定是非常完美。误区二:从开始阶段你可以考虑到所有的一切怎么才能走出这个误区呢?首先,你必须认识到你不能考虑到所有的细枝末节。

第二,认识到不管你的最初所作的规格说明书有多好,但注定代码会很快地与之失去同步,即便是你自己建模自己编码。一个基本的道理就是代码永远只会和代码保持一致。第三,认识到迭代法(小规模地建模,编一些代码,做一些测试,可能还会做一个小的工作版本)是软件开发的准则。它是现代重量级的软件开发过程(如EUP),以及轻量级(如XP)的基本原理。误区三:建模是在浪费时间许多人都这样认为,这主要是因为他们所接受的教育仅仅局限于如何编写代码,对于完整的开发流程鲜有接触。而且他们的经验也仅限于如何实现代码,就如初级程序员。他们放弃了提高效率和学习技能的机会,这些技能能够使他们很容易地适应不同的项目或组织。事实分析:在大多数情况下,在开始编码之前画一个草图、开发一个粗率的原型或者制作一些索引卡片都能提高你的生产效率。高效的开发者在编码之前都要进行建模工作。另外,建模是一种很好的在项目组成员与项目负责人之间沟通途径。你们在这个过程中探讨问题,从而对所要的是一个什么样的东西可以得到更好的理解,涉及到该项目中的每个成员也可得到对该项目有一个从分的了解。误区四:所有的开发人员都知道如何建模我们现在面临照这样一个严重的问题:许多不是开发人员的人,包括高级经理和用户,不知道软件是如何建成的。其结果,他们不能够区分开熟练的开发者和一般的程序员(当然也分不清高级程序员和一般程序员),他们想当然地认为所有的开发人员都具备从头到尾开发整个系统的技能。事实分析:这肯定是不正确的。建模的技能,是只有当一个开发者通过学习它,并经过长期的实践才能够掌握。一些非常聪明的程序员常常相信自己无所不能,正因为这样的狂妄自大,他们承当的一些任务是他们根本就没有相应的技能去完成的。软件开发是如此的复杂,单单一个人是很难具备所有的技能去成功地进行开发,甚至也不可能去配置有一定复杂程度的系统。开发者应该有自知之明,明白他们自己的弱点,学无止境。通过互相取长补短,建模者可从程序员身上学到一项技术的具体细节,程序员也可从建模者那里学到有价值的设计和体系结构的技术。建模十条原则仅有数据模型对于现代软件是不够的。接收变化,并且允许你的模型能够随着时间进行改进。你不能冻结它们,然后就期待着成功。模型并不一定就是文档,文档也不一定就是模型。大多数的模型可能也应该被丢弃。只有代码才能与代码保持真正的同步。一些简单的工具,比如白板,就完全足以应付大多数建模工作。思考,然后再编码。你总能从别人身上学到东西。建模可以用一种轻盈的方式。设计直到代码发布以后才算完成。怎样成为优秀的软件模型设计者

1.人远比技术重要

2.理解你要实现的东西

3.谦虚是必须的品格

4.需求就是需求

5.需求其实很少改变,改变的是你对需求的理解

6.经常阅读7.降低软件模块间的耦合度8.提高软件的内聚性9.考虑软件的移植性10.接受变化11.不要低估对软件规模的需求12.性能仅仅是很多设计因素之一13.管理接口14.走近路需要更长的时间15.别信赖任何人16.证明你的设计在实践中可行17.应用已知的模式18.研究每个模型的长处和弱点19.在现有任务中应用多个模型20.教育你的听众21.带工具的傻瓜还是傻瓜22.理解完整的过程对象(object),无论是具体的还是抽象的,遍布于我们的周围,它们组成了整个世界。程序通常也要模拟现实世界中的对象。首先最重要的,对象是一个类(种类)的实例。例如你和我都是Person这个类的实例,那么其中,你和我就是对象,而Person则是一个类。对象是系统中用来描述客观事务的一个实体,具有自身的结构(Structure),也就是说,它具有属性(特性)和行为。对象的行为包括它所能执行的操作。属性和操作合起来被称为特征。

如何理解面向对象思维方式?对象只描述客观事物本质的、与系统目标有关的特征,而不考虑那些非本质的、与系统目标无关的特征。类(Class)是具有相同的属性和方法的一组对象的集合,它为属于该类的全部对象提供了统一的对象描述。

同类对象具有相同的属性和方法,是指它们的定义形式相同,而不是说每个对象的属性值相同。

让我们再会到洗衣机的例子。如果指定洗衣机类具有brandName﹑modelName﹑serialName﹑和capacity等属性,还有acceptClothes()﹑acceptDetergent()﹑turnOn()和turnoff()等操作的话,你就有了制造WashingMachina类新实例的机制。也就是说,可以基于洗衣机这个类创建新的对象。

记住面向对象的目标是开发出能够反映现实世界某个特定片段的软件(或者说是“建模”)。你考虑到的属性和行为越多,你所建立的模型就越符合实际。在洗衣机的例子中,如果你在洗衣机类中包括drumVolume(洗涤缸容量)﹑trap(水阀)﹑motor(马达)﹑motorSpeed(马达转速)等属性的话,洗衣机模型就更精确。在面向对象的世界里,类除了起到分类的作用外,类还是用来创建对象的模板。如可以把类看成是加工小甜饼的模子,你可以用来压出新的小甜饼对象。一些面向对象的概念面向对象还包含对象的其它方面,这些方面包括抽象(abstraction)继承(inheritance)多态(polymorphism)封装(encapsulation)其他三种重要面向对象概念是消息传递(messagesending)关联(association)聚集(aggregation)抽象的意思就是过滤掉对象的一部分特性和操作直到只剩下你所需要的属性和操作。抽象是人类认识问题的最基本手段之一。在面向对象方法中的抽象,是指对具体的问题(对象)进行概括,抽出一类对象的公共性质并加以描述的过程。例如你的洗衣机包括什么,不包括什么,在做出这样的决策后所保留的部分就是对洗衣机的抽象。一些权威人士认为抽象对于建模者来说是最重要的技术,也就是说要搞清楚什么应该纳入模型中,什么应该舍去。一般来讲,对一个问题的抽象应该包括两个方面:1、数据抽象:描述某类对象的属性或状态,也就是此类对象区别于彼类对象的特征。2、行为抽象(功能抽象):描述的是某类对象的共同行为或功能特征。抽象(abstraction)继承(inheritance)每个消费类电子产品的子类(手机﹑电视机﹑电子词典等等)都继承了消费类电子产品的特征,在面向对象概念中,这种超类消费类电子产品与其子类的关系就是继承。注意每个子类都增加了自己的属性和操作。利用继承,子类可以继承父类的属性和方法,在一些文献里,往往把子类/父类称作特殊类/一般类、子类/超类、派生类/基类。继承增加了软件重用的机会,可以降低软件的开发和维护费用,而继承是OO技术和非OO技术的一个很明显的区别。利用继承可以开发更贴近现实的模型,使得模型更简洁。继承的另一个好处是可以保证类之间的一致性,父类可以为所有的子类定制规则。单继承和多继承单继承:子类只从一个父类继承多继承:子类只从一个父类继承交通工具水上交通工具陆地交通工具水陆两用交通工具陆地交通工具水上交通工具单继承多继承多态性

(polymorphism)有时不同的类具有相同名称的操作。在面向对象中,每个类都能够自己“知道”如何执行自己的打开操作,这就叫做多态性。在面向对象的世界里,多态是对人类思维方式的一种直接模拟,是指一个实体在不同的上下文条件下具有不同的意义或用法能力。例如你可以打开一扇门﹑打开一扇窗﹑打开报纸﹑打开一件礼物﹑打开银行帐号﹑甚至打开一段对话。

封装(encapsulation)封装:把对象的属性和方法结合成一个独立的系统单位,并尽可能地隐藏对象的内部细节。当一个对象执行自己的操作时,它对外界隐藏了操作的细节。封装使一个对象形成两个部分:接口部分和实现部分。对于用户来说,接口部分是可见的,而实现部分是不可见的封装提供了两种保护:首先,封装可以保护对象,防止用户直接存取对象的内部细节;其次,封装也保护了客户端,防止对象实现部分的变化可能会产生的副作用,即实现部分的改变不会影响到相应的客户端的改变消息传递(messagesending)面向对象方法的一个原则就是通过消息进行对象之间的通信,一个对象发送一个操作消息(或请求)给令一个对象,接收消息的对象就执行这个操作。消息(Message):就是向对象发出的服务请求,它包括了提供服务的对象标识、服务(方法)标识、输入信息和回答信息等。大家往往把消息等同于函数调用,事实上两者之间存在区别。消息可以包括同步消息和异步消息,如果消息是异步的,则一个对象发送消息后,就继续自己的活动,不等消息接收者返回控制,而函数调用往往是同步的,消息的发送者要等待接收者返回值。关联(association

)关联:对象之间以某种方式发生联系。多向关联单向关联多种方式的关联一个类和其它的多个类关联多重性(multiplicity)是对象之间关联的一个重要方面。它说明了在关联中一个类的对象可以对应另一个类的多少个对象。UML中的四种事物

1)结构事物---类、接口、协作(它是一个交互,它是由一组共同工作以提供某协作行为的角色和其它元素构成的一个群体。)、用例、主动类(至少拥有一个进程或者线程,其元素的行为可以和其它元素的行为并发)、构件(如COM+和JavaBean)、节点。

2)行为事物---交互、状态机(描述了一个对象或者一个交互在生命期内响应事件所经历的状态序列)。

3)分组事物---包

。4)注释事物---注解

UML中的四种关系

1)依赖(Dependency)---两个事物间的语义关系2)关联(Association)---是一种结构关系,如聚合3)泛化(Generalization)---一般/特殊关系4)实现(Realization)---用在两种地方:接口和实现他们之间的类和构件之间;用例和实现他们的协作之间。

UML的视图(View)和图(

Diagram)标准建模语言UML的重要内容可以由下列五类视图(共9种图形)来定义:UML中的各种组件和概念之间没有明显的划分界限,但为方便起见,我们用视图来划分这些概念和组件。视图只是表达系统某一方面特征的UML建模组件的子集。视图的划分带有一定的随意性,但我们希望这种看法仅仅是直觉上的。在每一类视图中使用一种或两种特定的图来可视化地表示视图中的各种概念。·第一类是用例视图(UsecaseView),强调从用户角度看到的或需要的系统功能,并指出各功能的操作者。包括用例图。

用例图用来描述系统功能

第二类是静态视图(StaticView),展现系统的静态或结构组成及特征。包括类图、对象图和包图。

其中类图描述系统中类的静态结构。不仅定义系统中的类,表示类之间的联系如关联、依赖、聚合等,也包括类的内部结构(类的属性和操作)。类图描述的是一种静态关系,在系统的整个生命周期都是有效的。

对象图是类图的实例,几乎使用与类图完全相同的标识。他们的不同点在于对象图显示类的多个对象实例,而不是实际的类。

一个对象图是类图的一个实例。由于对象存在生命周期,因此对象图只能在系统某一时间段存在。

包由包或类组成,表示包与包之间的关系。包图用于描述系统的分层结构。

·第三类是行为视图(BehaviorView),描述系统的动态模型和组成对象间的交互关系。包括状态图和活动图其中状态图描述类的对象所有可能的状态以及事件发生时状态的转移条件。通常,状态图是对类图的补充。在实用上并不需要为所有的类画状态图,仅为那些有多个状态其行为受外界环境的影响并且发生改变的类画状态图。活动图描述满足用例要求所要进行的活动以及活动间的约束关系,有利于识别并行活动。第四类是交互图(InteractiveView),描述对象间的交互关系。包括顺序图和合作图其中顺序图显示对象之间的动态合作关系,它强调对象之间消息发送的顺序,同时显示对象之间的交互;合作图描述对象间的协作关系,合作图跟顺序图相似,显示对象间的动态合作关系。除显示信息交换外,合作图还显示对象以及它们之间的关系。如果强调时间和顺序,则使用顺序图;如果强调上下级关系,则选择合作图。·第五类是实现图(ImplementationVIew)。包括构件图和配置图其中构件图描述代码部件的物理结构及各部件之间的依赖关系。一个部件可能是一个资源代码部件、一个二进制部件或一个可执行部件。它包含逻辑类或实现类的有关信息。部件图有助于分析和理解部件之间的相互影响程度。配置图定义系统中软硬件的物理体系结构。它可以显示实际的计算机和设备(用节点表示)以及它们之间的连接关系也可显示连接的类型及部件之间的依赖性。在节点内部,放置可执行部件和对象以显示节点跟可执行软件单元的对应关系。视图和图的总结用例视图(UsecaseView),动态视图(DynamicView),也称为行为视图(BehaviorView),也称为并发视图(ConcurrentView)实现图(ImplementationView),也称为组件视图(ComponentView)交互视图(InteractiveView),静态视图(StaticView),也称为逻辑视图(LogicView),也称为结构模型视图(StructuralModelView)图的总结用例图(UseCaseDiagram)类图(ClassDiagram)对象图(ObjectDiagram)组件图(ComponentDiagram)配置图(DeploymentDiagram),也被称为部署图,实施图静态视图时序图(SequenceDiagram),也被称为顺序图,序列图协作图(CollaborationDiagram)状态图(StateChartDiagram)活动图(ActivityDiagram)动态视图主要的域视图图主要概念结构静态视图类图类、关联、泛化、依赖关系、实现、接口用例视图用例图用例、参与者、关联、扩展、包括、用例泛化实现视图构件图构件、接口、依赖关系、实现部署视图部署图节点、构件、依赖关系、位置动态状态视图状态图状态、事件、转换、动作、活动视图活动图状态、活动、完成转换、分叉、结合交互视图顺序图交互、对象、消息、激活协作图协作、交互、协作角色、消息模型管理模型管理视图包图包、子系统、模型可扩展性所有所有约束、构造型、标记值UML视图和图类图描述系统中类的静态结构。不仅定义系统中的类,表示类之间的联系如关联、依赖、聚合等,也包括类的内部结构(类的属性和操作)。类图描述的是一种静态关系,在系统的整个生命周期都是有效的。对象图是类图的实例,几乎使用与类图完全相同的标识。他们的不同点在于对象图显示类的多个对象实例,而不是实际的类。一个对象图是类图的一个实例。由于对象存在生命周期,因此对象图只能在系统某一时间段存在。

在UML中一个矩形表示一个类的图标

类的可视化表示

WashingMachine注:按照UML的约定1、把类名的首字母大写,放在矩形的偏上部。2、如果类名是由两个单词组成,那么将两个单词合并,第二个单词首字母大写。属性

属性是类的一个特性。它描叙了类的对象(也就是类的实例)所具有的一系列特性值。一个类可以具有零个到多个属性。属性名列表放在类名之下,并且和类名之间用分隔号隔开,如图所示。注:按照UML的约定1、单个单词的属性名的小写。2、如果属性名是由多个单词组成,那么将多个单词合并,除了第一个单词外,其它单词的首字母大写。WashingMachinebrandNamemodeNameserialNumber属性的附加信息UML还允许指明属性的附加信息。要指明类型,则在属性值后面加上类型名,中间用冒号隔开。还可以为属性指定一个缺省值WashingMachinebrandName:String=“海尔”modeName:StringserialNumber:String对象类的属性在该类的每个对象中都有具体值。下图是一个例子。注意,对象名首写字母小写,后面根一个冒号,冒号后面是该对象所属的类名,并且整个名字要带下划线。myWasher:WashingMachinebrandName=“海尔”modeName=“小神童”serialNumber=“GL0214”命名对象或者不命名对象名字myWasher:WashingMachine是一个命名实例(namedinstance)。也可以有诸如:WashingMachine这样的匿名实例(anonymousinstance)。

操作操作(operation)是类能够做的事情或者你(或者另一个类)能对类做的事情。操作名列表要放在属性名列表之下,两者之间用分隔线隔开,如图所示。WashingMachinebrandNamemodeNameserialNumberaddClothes()removeClothes()turnON()注:按照UML的约定1、单个单词的操作名的小写。2、如果操作名是由多个单词组成,那么将多个单词合并,除了第一个单词外,其它单词的首字母大写。操作的附加信息你也可以为操作指定附加信息。在操作名后面的括号中可以说明操作所需要的参数和参数类型。有一种操作叫函数(function),它在完成操作后要返回一个返回值。可以指明函数的返回值及返回值的类型。WashingMachinebrandNamemodeNameserialNumberaddClothes(C:String)removeClothes(C:string)turnON():Boolean1、在实际中,可以只给出类名,而将属性或者操作区(或者两个全都)空着,如图所示:属性操作的可视化表示WashingMachine2、有时可以只显示类的一部分属性和方法,这种省略了一个或多个属性或者操作的的表示法叫做类的省略表示法(elidingaclass)。图说明了类的省略表示法。WashingMachinebrandName…addClothes()…3、如果属性或者操作列表太长,可以用构造型来组织属性或操作列表,以便理解。

构造型是UML提供的扩展机制。WashingMachine<<idinfo>>modeNameserialNumber<<machineinfo>>capacity<<clothes-related>>addClothes()removeClothes()职责和约束

职责(reponsibility)描叙了类做什么——也就是类的属性和操作能完成什么任务。在图标中,职责在操作区域下面的区域中说明。类的职责是消除二意性的一种非形式化的方法。WashingMachinebrandName…addClothes(C:String)…Takedirtyclothesasinputandproducecleanclothesasoutput.职责更形式化的方式是使用约束(constraint),它是用花括号括起来的自由文本。括号中的文本指定了改类所要满足的一个或多个规则。如图所示:WashingMachinebrandNamecapacityaddClothes()…{capacity=16or18or20}约束附加注释

我们还可以以对类附加注释的形式为类添加更多的信息。下图中的注释说明了serialNumber(序列号)属性引用了政府标准。记住,注释可以包含图形也可以包含文本。

WashingMachinebrandNamemodeNameserialNumberaddClothes()removeClothes()turnON()当类之间在概念上有连接关系时,类之间的连接叫做关联

关联(association)

为球队效力关联的可视化方法是用一条线连接两个类,并把关联的名字(例如“playson”)放在这个连接线之上。表示出关联的的方向是很有用的,关联的方向用一个实心三角形箭头来指明。下图说明如何可视化表示队员和球队之间的playson关联。球员球队▲

当一个类与另一个类发生关联时,每个类通常在关联中都扮演着某种角色。在队员和球队的关联中,如果球队是职业篮球队,那么它就是队员的雇主(employer)。下图说明了如何表示出这些角色。为球队效力球员球队▲员工雇主关联还可以从另一个方向发生:篮球队雇佣(Employ)队员。可以把这两个方向上的关联表示在一个图中,用实心三角形箭头指明各自关联的方向,下图所示。为球队效力球员球队▲雇用球员▲关联也可以好几个类连接同一个类。如图所示的关联图。为球队效力前锋球队▲中锋后卫为球队效力▲为球队效力▲关联上的约束

有时两个类之间的一个关联随后就有一个规则。可以通过关联线附近加注一个约束来说明这个规则。如图所示。

服务银行出纳员顾客▲{有序}另一种类型的约束关系是Or(或)关系,通过两条关联线之间联一条虚线,虚线之上标注{or}来表示这种约束。图是高中生(highschoolstudent)选(choose)文科,或者选理科时的模型

选择高中生文科▲理科选择▲{或}

和类一样,关联也可以有自己的属性和操作,此时。这个关联实际上是个关联类。图是球员类和球队类之间的关联对应的关联类:合同关联类。它同时又和经理类发生关联。

关联类(associationclass)球员球队员工雇主合同经理管理▲正如对象是类的实例一样,关联也有自己的实例。如果我们想象要一个特定的队员效力一个特定的球队,那么两者之间的为球队效力关系就叫做一个链,可以用两个对象之间的连线来表示它。和对象的名字要加下划线一样链的名字也要加下划线,如图所示。链(link)为球队效力姚明:球员火箭队:球队▲多重性(multiplicity)某个类有多个对象可以和另一个类的单个对象关联。表示多重性方法是在参与关联的类附近的关联线上著名多重性数值,如图所示。首发球员球队51实际上存在各种可能的多重性。两个类之间可以是一对一、一对多、一对一或多、一对零或一、一对N或者一对一组选择。UML使用星号(*)来代表许多(more)和多个(many)。在一种语境中,两点代表Or(或)关系,例如“1..*”代表一个或多个。在另一种语境中,Or关系用逗号来表示,例如“5,10”代表5或10。下图显示了各种可能的多重性表示方法。丈夫妻子11一对一老师学生*1一对多银行职员顾客1..*1一对一或多自行车车轮21一对二鸡蛋盒鸡蛋12,241一对12或24▲▲▲▲限定关联

当关联的多重性是一对多时,就产生了一个特殊的问题:查找问题。当一个类的对象必须要选择规则中的另一个类的特定对象来满足关联中的角色时,第一个类必须依赖一个具体的属性值来找到正确的对象。这个属性值通常是一个标识符号,在UML中,ID(identification,标识)信息叫做限定符(qualifier)。它的符号是一个小矩形框,把作为一对多多重性的一部分的类连在一起。图表示了这种关系。房间预定表预定的房间1*房间预定表预定的房间11房间号自身关联(reflexiveassociation)有时,一个类可能与它自身发生关联,这样的关联被称为自身关联。当一个类的对象可以充当多种角色时,自身关联就可能发生。司机乘客11..4搭乘车上的人▲继承(inheritance)和泛化(generalization)

面向对象的一个特点是它能够反映日常生活中的常识:如果你知道某事务所属的种类,你就自然会知道同类的其它事物也具有该事物的一些特征。在面向对象的术语中,上述的关系被称为继承,UML中也称它为泛化。一个类,可以继承另一个类的属性和操作。继承层次并不止是两层:子类还可以是另一个子类的父类。在UML中,用父类到子类之间的连线关系来表示继承关系。父类的连线部分,指向父类的一端带有一个空心三角形箭头。注意:在父类中已经指明的属性和操作,在子类中可以不用再指明。子类除了继承父类的属性和操作外,通常也增加了自己的属性和操作。△△动物两栖动物爬行动物哺乳动物马子类除了继承父类的属性和操作外,通常也增加了自己的属性和操作。一个类可能没有父类,这种没有父类的类被称为基类(baseclass)或根类(rootclass)一个类也可以没有子类,没有子类的类被称为叶类(leafclass).如果一个类恰好只有一个父类,这样的继承被称为单继承(singleinheritance),如果一个类有多个父类,这样的继承就是多继承(multipleinheritance)。找出继承的关系

系统分析员可以通过多种方式发现类之间的关系。作为候选的类有可能和它们的父类、子类在谈话中同时被发现。系统分析员能意识到某个类的属性和操作也许能被运用到其它多个类当中去——此外,这几个类还有属于自己的特定属性和操作。另一种可能情况是系统分析员注意到两个或多个类具有相同的属性和操作数。抽象类(abstractclass)像不提供实例对象的类被称为是抽象的(abstract)。表明一个类是抽象类的方法是类名用斜体书写。下图示意了抽象类和它的子类的表示方法。前锋中锋后卫球员△抽象类斜体书写依赖(dependency)另一种类间关系是一个类使用了另一个类,这种关系叫做依赖。最通常的依赖关系是一个类操作的构型中用到了另一个类的定义。

依赖关系用带箭头的虚线表示,如图所示。系统表格显示表格类图和对象图

类图给出了一般性的、定义性的信息:一个类的特性以及它的属性,以及和这个类关联的其他的类。对象图则在某个特定时刻及时给出了一个类的多个具体实例以及它们如何联系起来等相关信息。聚集

(aggregation)一个类有时由几个部分类组成的,这种特殊类型的关系被称为聚集。部分类和由它们组成的类之间是一种整体-部分(part-whole)关系。按照聚集关系的表示法,聚集关系构成了一个层次结构。“整体”类位于层次结构的最顶部,以下依次是各个“部分“类。整体和部分之间用带空心菱形箭头的连线连接,箭头指向整体。下图示意了家用计算机系统的组成。CPU1个人计算机音箱主机键盘鼠标显示器

111112磁盘驱动器声卡显卡内存连接到11*1

2▲1在上个例子中的每个部分都属于一个整体,但聚集的关系并不是只有这种情况。例如:在一个家庭影院系统中,电视机和影碟机可以共用一个遥控器,那么这个遥控器既是电视机的组成部分也是影碟机的组成部分。

聚集上的约束有时一个聚集体可能有多种部分体组成,这些部分体之间是“Or”关系。我们在两个整体-部分关系线之间加上一花括号括起来的“Or”来表示这个约束,并用虚线连接这两个关系线,如图所示。一顿饭汤沙拉主食甜点

11111{or}组成

组成是强类型的聚集。聚集(组成)中的每个部分体只能属于一个整体。除了菱形箭头是实心之外,组成和聚集的表示法相同,如图所示。咖啡桌桌腿桌面111◆接口是描叙类的部分行为的一组操作,它也是一个类提供给另一个类的一组操作。

一个类和它的接口之间的关系叫做实现。如洗衣机保证了它的部分行为能够“实现”控制柄的行为。

接口的模型表示法和类大致相同,都是用一个矩形图标来代表。和类的不同之处在于,接口只是一组操作,没有属性。如果一个类表示了省略了属性,那么怎么区分类和接口呢?一种办法是使用构造型《interface》,把它放在矩形框中接口的名字之上。另一个办法是接口的名字以大写字母“I”开头。

表示类和接口之间的实现关系的符号和继承关系的符号有些相似,只不过它是一个带空心三角形的箭头,箭头的方向指向接口。下图示意了洗衣机和控制旋钮之间的实现关系。

接口(interface)和实现(realization)<<interface>>洗衣机控制旋钮△另一种表示法(省略表示法)是将接口表示为一个小圆圈,并和实现它的类用一条线连起来,如图所示。这种图有时候形象地被称为棒糖图(lollipopdiagram)。洗衣机○控制旋钮上图表示了销售中的用例关系。一个类可以实现多个接口,一个接口也可以被多个类实现。由于我们要依靠接口实现洗衣机的操作,我们把通过接口的交互建模为一种依赖。下图示意了这种关系。注意:图中使用依赖符号,对通过接口和类的交互来建模。<<interface>>洗衣机控制旋钮△用户实现关系将一种模型元素(如类)与另一种模型元素(如接口)连接起来,其中接口只是行为的说明而不是结构或者实现。客户必须至少支持提供者的所有操作(通过继承或者直接声明)。虽然实现关系意味着要有像接口这样的说明元素,它也可以用一个具体的实现元素来暗示它的说明(而不是它的实现)。泛化和实现关系都可以将一般描述与具体描述联系起来。泛化将在同一语义层上的元素连接起来(如,在同一抽象层),并且通常在同一模型内。实现关系将在不同语义层内的元素连接起来(如,一个分析类和一个设计类;一个接口与一个类),并且通常建立在不同的模型内。在不同发展阶段可能有两个或更多的类等级,这些类等级的元素通过实现关系联系起来。两个等级无需具有相同的形式,因为实现的类可能具有实现依赖关系,而这种依赖关系与具体类是不相关的。实现关系用一条带封闭空箭头的虚线来表示,且与泛化的符号很相像。用一种特殊的折叠符号来表示接口(无内容)以及实现接口的类或构件。接口用一个圆圈表示,它通过实线附在表示类元的矩形上。接口和端口(port)鼠标是如何连接到计算机的?沿着鼠标后面的电缆,在计算机的后面,你会看到一个端口,也就是鼠标接入的地方。当然你的计算机也可能由一系列端口,包括一个并行端口以及一个或多个USB端口。计算机正是通过这些端口和外界的环境交互。UML2.0提供了一个符号用来对这些交互点建模。如图所示,端口符号是位于类符号边缘上的一个小方格,这个小方格连接到接口。鼠标口○鼠标计算机可见性(visibility)可见性可应用于属性或操作,它说明在给定类的属性和操作(或者接口的操作)的情况下,其他类可以访问到的属性和操作的范围。可见性由3种层次(级别)。1、在公有(Public)层次上其他类可以直接访问这个层次中的属性和操作。2、在受保护(Protected)层次上,只有继承了这些属性和操作的子类可以访问最初类的属性和操作。3、在私有(Private)层次上,只有最初的类才能访问这些属性和操作。实现关系意味着接口中的所有操作都是公有的。下图示意了前面提到的电视机类和汽车类中的公有、受保护的和私有操作。Television+brandName+modeName…+changeVolume()+changeChannel()-paintImageOnScreen()…Automobile+brandName+modeName…+accelerate()+brake()#updateMileageCount()…说明:属性或操作前面有“+”号,该属性或操作是公有的属性或操作前面有“-”号,该属性或操作是受保护的属性或操作前面有“#”号,该属性或操作是私有的作用域(scope)作用域是与属性和操作相关的有一个重要概念。存在两种可能性的作用域。1、在实例(instance)作用域下,类的每个实例对象都有自己的属性值和操作。2、在分类符(classifier)作用域下,一个类的所有实例只存在一个属性值和操作。当用例视图在外部用户前出现时,它捕获到系统、子系统或类的行为。它将系统功能划分成对参与者(即系统的理想用户)有用的需求。而交互功能部分被称作用例。用例使用系统与一个或多个参与者之间的一系列消息来描述系统中的交互作用。参与者可以是人,也可以是外部计算机系统和外部进程。1、概述2、用例(usecase)

用例是外部可见的一个系统功能单元,这些功能由系统单元所提供,并通过一系列系统单元与一个或多个参与者之间交换的消息所表达。用例的用途是在不揭示系统内部构造的情况下定义连贯的行为。用例的定义包含用例所必需的所有行为—执行用例功能的主线次序、标准行为的不同变形、一般行为下的所有异常情况及其预期反应。从用户角度来看,上述情况很可能是异常情况;从系统角度来看,它们是必须被描述和处理的附加情况。在模型中,每个用例的执行独立于其他用例,虽然在具体执行一个用例功能时由于用例之间共享对象的缘故可能会造成本用例与其他用例之间有这样或那样的隐含的依赖关系。每一个用例都是一个纵向的功能块,这个功能块的执行会和其他用例的执行发生混杂。用例的动态执行过程可以用UML的交互作用来说明,可以用状态图、顺序图、合作图或非正式的文字描述来表示。用例功能的执行通过类之间的协作来实现。一个类可以参与多个协作,因此也参与了多个用例。在系统层,用例表示整个系统对外部用户可见的行为。一个用例就像外部用户可使用的系统操作。然而,它又与操作不同,用例可以在执行过程中持续接受参与者的输入信息。用例也可以被像子系统和独立类这样的小单元所应用。一个内部用例表示了系统的一部分对另一部分呈现出的行为。例如,某个类的用例表示了一个连贯的功能,这个功能是该类提供给系统内其他有特殊作用的类的。一个类可以有多个用例。用例是对系统一部分功能的逻辑描述,它不是明显的用于系统实现的构件。非但如此,每个用例必须与实现系统的类相映射。用例的行为与类的状态转换和类所定义的操作相对应。只要一个类在系统的实现中充当多重角色,那么它将实现多个用例的一部分功能。设计过程的一部分工作即在不引入混乱的情况下,找出具有明显的多重角色的类,以实现这些角色所涉及的用例功能。用例功能靠类间的协作来实现。3、用例的可视化表示MaintainScheduleMaintainCurriculumRequestCourseRoster在UML中,用例表示为一个椭圆,用例的名字可以放在椭圆的里面,也可以放在椭圆的下面。4、参与者(actor)

参与者是与系统、子系统或类发生交互作用的外部用户、进程或其他系统的理想化概念。作为外部用户与系统发生交互作用,这是参与者的特征。在系统的实际运作中,一个实际用户可能对应系统的多个参与者。不同的用户也可以只对应于一个参与者,从而代表同一参与者的不同实例。每个参与者可以参与一个或多个用例。它通过交换信息与用例发生交互作用(因此也与用例所在的系统或类发生了交互作用),而参与者的内部实现与用例是不相关的,参与者可以被一组定义它的状态的属性充分描述。参与者可以通过泛化关系来定义,在这种泛化关系中,一个参与者的抽象描述可以被一个或多个具体的参与者所共享。参与者可以是人、另一个计算机系统或一些可运行的进程。在图中,参与者用一个名字写在下面的小人表示。如下图所示:StudentBillingSystem5、用例模型(usecasemodel)用例参与者参与者用例分析的一个好处是它能够展现出系统和外部世界之间的边界。参与者是典型的系统外部实体,而用例是典型的属于系统内部。系统的边界用一个矩形来代表,里面写上系统的名字。系统的用例装入矩形之内。系统用例的发起者在用例图的左侧,接受者在用例图的右侧。参与者的名字放在参与者图标的下方。关联线连接参与者和用例并且表示参与者与用例之间有通信关系。关联线是实线,和类之间的关联线类似。6、包含用例虽然每个用例的实例是独立的,但是一个用例可以用其他的更简单的用例来描述。这有点像一个类可以通过继承它的超类并增加附加描述来定义。一个用例可以简单地包含其他用例具有的行为,并把它所包含的用例行为做为自身行为的一部分,这被称作包含关系。在这种情况下,新用例不是初始用例的一个特殊例子,而且不能被初始用例代替。包含关系可以用含有关键字<<include>>的带箭头的虚线表示。包含关系箭头指向被包含的用例。打开销售机<<include>>向自动销售机中放物品<include>>关闭销售机7、扩展用例一个用例也可以被定义为基用例(原来的用例)的增量扩展,这叫做扩展关系。同一个基用例的几个扩展用例可以在一起应用。基用例的扩展增加了原有的语义,此时是本用例而不是扩展用例被作为例子使用。扩展点(extensionpoints):扩展只能发生在基用例的序列中的某几个具体指定点上,这个点被称为扩展点。扩展关系可以用含有关键字<<extend>>的带箭头的虚线表示。扩展关系箭头指向被扩展的用例。在基用例中,扩展点出现在”extensionpoint”的下方。打开销售机<<include>>向自动销售机中放物品<include>>关闭销售机extensionpoint在放入物品前补充物品按照物品的销售情况<extend>>一个用例也可以被特别列举为一个或多个子用例,这被称做用例泛化。当父用例能够被使用时,任何子用例也可以被使用。

用例泛化与其他泛化关系的表示法相同,都用一个三角箭头从子用例指向父用例。

8、用例泛化买一杯饮料△买一罐饮料买饮料参与者之间也像用例一样可能存在泛化关系。9、参与者泛化参与者泛化与用例泛化关系的表示法相同,都用一个三角箭头从子参与者指向父参与者。财务经理项目经理经理人事经理△△△关系功能表示法关联参与者与其参与执行的用例之间的通信途径扩展在基础用例上插入基础用例不能说明的扩展部分用例泛化用例之间的一般和特殊关系,其中特殊用例继承了一般用例的特性并增加了新的特性包括在基础用例上插入附加的行为,并且具有明确的描述<<extend>><<extend>><<extend>><<extend>><<include>>用例的适用性

用例首先用于需要响应客观事件的系统。它们能用于提供了一个有很容易理解的目标的清楚的行为者的环境。当结果不可定义或不清晰时不能用用例。意思是如果目标成功或目标失败不能有一个明确的定义,那么用例不能用来捕获需求。然而说到这,现在大部分对象方法都使用用例。因为用例被证明是捕获需求的非常有效的机制。

1、概述状态视图通过对类对象的生存周期建立模型来描述对象随时间变化的动态行为。每一个对象都被看作是通过对事件进行探测并做出回应来与外界其他部分通信的独立的实体。事件表示对象可以探测到的事物的一种运动变化—如接受到从一个对象到另一个对象的调用或信号、某些值的改变或一个时间段的终结。任何影响对象的事物都可以是事件,真实世界所发生的事物的模型通过从外部世界到系统的信号来建造的。状态是给定类的对象的一组属性值,这组属性值对所发生的事件具有相同性质的反应。换而言之,处于相同状态的对象对同一事件具有同样方式的反应,所以当给定状态下的多个对象当接受到相同事件时会执行相同的动作,然而处于不同状态下的对象会通过不同的动作对同一事件做出不同的反应。例如,当自动答复机处于处理事务状态或空闲状态时会对取消键做出不同的反应。状态用于描述类的行为,但它们也描述用例、协作和方法的动态行为。对这些对象方面而言,一个状态代表了执行中的一步。我们通常用类和对象来描述状态,但是它也可以被其他元素所直接应用。状态描述了一个类对象生命期中的一个时间段。它可以用三种附加方式说明:在某些方面性质相似的一组对象值;一个对象等待一些事件发生时的一段时间;对象执行持续活动时的一段时间。虽然状态通常是匿名的并仅用处于该状态时对象进行的活动描述,但它也可以有名字。在状态机中,一组状态由转换相连接。虽然转换连接着两个状态(或多个状态,如果图中含有分支和结合控制),但转换只由转换出发的状态处理。当对象处于某种状态时,它对触发状态转换的触发器事件很敏感。状态用具有圆形拐角的矩形表示。如图所示。InitializationInitialization状态间带箭头的实线代表状态的迁移,箭头指向目标状态。图中的实心圆代表状态转移的起点,带圆圈的实心圆代表终点。Canceled2、在状态图中增加细节UML中提供了在状态图中增加细节的选项。可以把状态图标分成两个区域。最上面的区域保存状态名(必要),下面的区域保存在该状态中发生的活动。如下图所示:InitializationDo/

Initializecourse常见的三个活动是:1、入口动作(entry):进入某一状态时执行的动作。2、动作(do):系统处于该状态时要发生的动作。3、出口动作(exit):离开某一状态时执行的动作。状态图中增加细节示例图Faxingentry/输入传真号do/逐页传真exit/完成传送do/传真纸进入3、触发器事件(triggerevent)触发器事件是引起转换的事件。事件可以有参数,以供转换的动作使用。添加的事件和动作写在转移线上。

有时候一个事件会引起没有相关动作的状态转移,或者有时一个转移是由于某个状态完成了它的活动所引起(而不是由于事件引起)。这种类型的状态转移被称为无触发器转移(trigglerlesstransition)。初始化关机中Do/启动关机打开计算机工作转换可能具有一个保护条件,保护条件是一个布尔表达式。保护条件可以引用对象的属性值和触发事件的参数。当一个触发器事件被触发时,监护条件被赋值。如果布尔表达式的值为“真”,那么触发事件即,使转换有效。如果布尔表达式的值为“假”,则不会引起转换。保护条件只能在触发事件发生时被赋值一次。如果在转换发生后保护条件由原来的“假”变为“真”,则因为赋值太迟而不能触发转换。

从一个状态引出的多个转换可以有同样的触发器事件,但是每个转换必须具有不同的保护条件。当其中一个保护条件满足时,触发器事件会引起相应的转换。通常,保护条件的设置要考虑到各种可能的情况以确保一个触发器事件的发生应该能够引起某些转换。如果有些情况没有考虑到,一个触发器事件没有引起任何转换,那么在状态机视图中要忽略这个事件。一个事件的发生只能同时引起一个转换(在一个控制线程中)。如果一个事件可能引起多个转换,那么其中只有一个转换有效。如果两个相互矛盾的转换同时有效,则无法确定到底发生了哪个转换。这两个转换随机地发生一个,或者由系统的实现细节决定究竟发生哪一个,但是对建模者来说,无法预料这种转换产生的后果。4、增加转移的细节:保护条件保护条件示例图初始化关机中Do/启动关机打开计算机工作屏幕保护设定时间键盘或鼠标移动5、子状态(substate)某些状态存在于单个状态之中,因此它们被称为子状态。子状态以两种形式出现:顺序子状态和并发子状态。5.2、组成状态5.1、子状态一个简单状态没有子结构,只带有一组转换和可能的入口和出口动作。组成状态是一个被分解成顺序的或并发的子状态的状态。将状态分解成互斥的子状态是对状态的一种专门化处理。5.3、顺序子状态(sequentialsubstate)正如其名字一样,顺序子状态按照顺序一个接着一个出现。重新分析前面提到的“工作”状态,可以有如下图:等待用户输入验证用户输入登记用户输入用户输入工作5.4、并发子状态(concurrentsubstate)子状态是在同时执行的状态是并发状态。并发状态之间用虚线隔开。等待用户输入验证用户输入登记用户输入[间隔时间]工作更新时间显示系统时钟用户输入Copyright©1997byRationalSoftwareCorporation6、几个状态图示例InitializationOpenEntry/RegisterstudentExit/IncrementcountClosedCanceledDo/

InitializecourseDo/FinalizecourseDo/NotifyregisteredstudentsAddStudent/Setcount=0Addstudent[count<10][count=10]CancelCancelCancel6.1、课程登记状态图6.2、售票状态图初始状态是Available状态。在票开始对外出售前,一部分票是给预约者预留的。当顾客预定票,被预定的票首先处于锁定状态,此时顾客仍有是否确实要买这张票的选择权,故这张要票可能出售给顾客也可能因为顾客不要这张票而解除锁定状态。如果超过了指定的期限顾客仍未做出选择,此票被自动解除锁定状态。预约者也可以换其他演出的票,如果这样的话,最初预约票也可以对外出售。6.2.1、售票状态图说明1、概述对象间的相互作用体现了对象的行为。这种相互作用可以描述成两种互补的方式,一种以独立的对象为中心进行考察,另一种以互相作用的一组对象为中心进行考察。状态图的描述范围不宽,但它描述了对象深层次的行为,是单独考察每一个对象的“微缩”视图。对状态图的说明是精确的并且可直接用于代码。然而,在理解系统的整个功能时存在困难,因为状态图一个时刻只集中描述一个对象,要确定整个系统的行为必需同时结合多个状态图进行考察。交互视图更适合于描述一组对象的整体行为。交互视图是对象间协作关系的模型。2、协作协作描述了在一定的语境中一组对象以及用以实现某些行为的这些对象间的相互作用。它描述了为实现某种目的而相互合作的“对象社会”。协作中有在运行时被对象和连接占用的槽。协作槽也叫做角色,因为它描述了协作中的对象或连接的目的。类元角色表示参与协作执行的对象的描述;关联角色表示参与协作执行的关联的描述。类元角色是在协作中被部分约束的类元;关联角色是在协作中被部分约束的关联。协作中的类元角色与关联角色之间的关系只在特定的语境中才有意义。通常,同样的关系不适用于协作外的潜在的类元和关联。静态视图描述了类固有的内在属性。例如,交通工具需要有一个所有者。协作图描述了类实例的特性,因为它在协作中起特殊的作用,例如,在一个租车的协作中,所租的车需要租车司机,它通常与交通工具不直接相关但它是协作的基本部分。系统中的对象可以参与一个或多个协作。虽然协作的执行通过共享对象相连,但是对象所出现的协作不必直接相关。例如,在一个休假模型中,某人可以既是租车司机同时又是旅店的客人。不经常出现的情况是一个对象在同一个协作中可能担当多个角色。合作包括结构和行为两个方面。结构方面与静态视图相似—包含一个角色集合和它们之间的关系,这些关系定义了行为方面的内容。行为方面是一个消息集合,这些消息在具有某一角色的各对象间进行传递交换。协作中的消息集合叫做交互。一个协作可以包含一个或多个交互,每个交互描述了一系列消息,协作中的对象为了达到目标交换这些消息。状态机描述范围具有一定的局限性,但它的描述层次较深入,协作不受限制但描述层次较浅。它捕获了对象组成的网络结构中相互发送消息的整体行为。协作表示潜藏于计算过程中的三个主要结构的统一,即数据结构、控制流和数据流的统一。1、概述与顺序图一样,协作图也展示对象之间的交互关系。它绘制出对象与对象之间的消息连接。顺序图与协作图很相似,实际上这两种图表达的是同一种信息,并且可以将顺序图转换为等价的协作图,反之亦然。顺序图和协作图虽然都可以表示各对象间的交互关系,但它们的侧重点不同。顺序图强调的是交互的时间顺序。协作图强调的是交互的语境与参与交互的对象的整体组织。顺序图用消息的几何排列关系来表达消息的时间顺序,各角色之间的相关关系是隐含的。协作图用各个角色的几何排列图形来表示角色之间的关系,并用消息来说明这些关系。还可以从另外一个角度来看两种图的定义:顺序图按照时间顺序布图,而协作图按照空间组织布图。在实际中可以根据需要选用这两种图。2、协作图在UML中的表示方法对象图展示出对象和对象之间的静态关系。协作图是对象的扩展。协作图除了展示出对象之间的关联,还显示出对象之间的消息传递。通常在协作图中省略掉关联的名字,因为表示出关联的名字会使图变得混乱。关联线附近的箭头线表示对象之间传递的消息,箭头指向消息接收对象。消息名称和消息序号附在箭头线附近。消息的一般含义是触发接收消息的对象执行它的一个操作。箭头的含义和顺序图中的一样。:对象名2:对象名1add()协作图图符集:对象名2上面说过,可以将顺序图转换为协作图。反过来也成立。因此在协作图中也应能表示出消息的顺序。可以在消息名前面加上消息的序号,它代表该消息在消息序列中的序号。消息名和序号之间用冒号隔开。:对象名1:对象名31:add()2:modify()3:update()3、协作图和顺序图的比较下面我们来绘制一张对象图来对类的实例建模,这张图协作图的基础。:汽车:遥控车钥匙:车主对类的实例建模的对象图3.1、协作图和顺序图的基础--类图示例拥有▲开启▲搭载▲:汽车:遥控车钥匙:车主2:processKeyMessage(b)4:blinkLights1:getButtonPress(b)3.2、协作图示例5:beep[b=“lock”]3:lock对对象间消息建模得到的协作图3.3、顺序图示例:车主:遥控车钥匙:汽车1:getButtonPress(b)2:processKeyMessage(b)4:blinkLights5:beep[b=“lock”]3:lock和协作图等价的顺序图3.4、状态变化和消息的嵌套假设汽车有一个Locked

属性,其值可以是True或False。你可以假设汽车有两个状态,分别是Locked和Unlocked,如图所示。UnlockedLockedLockMessageUnlockMessage对汽车的Locked和Unlocked状态建模我们能够在协作图中表示状态的变化。在本例中,我们在一个汽车对象中给出locked值。然后,我们复制一个带有不同locked值的汽车对象。把这两个对象连接起来,再表示出从第一个对象到第二个对象的消息。用关键字《become》标示出这条消息。这个例子是我们有机会来体验和协作图相关的另一个概念,使用数字系统来表示消息之间的某些关系。到目前为止,我们已见过按顺序出现的消息,其实消息也可能以嵌套的形式出现。你可以这样对嵌套消息编号:首先是它所嵌入其中的消息的号码,然后是一个小数点,然后是被嵌套的消息的号码。下图展示了状态变化和消息嵌套。:汽车:遥控车钥匙:车主2:processKeyMessage(b)4:blinkLights1:getButtonPress(b)5:beep:汽车[b=“lock”]3:lock3.1《become》对协作图中的状态变化建模4、其它概念4.1、发送给多对象的消息一个对象可能会向同一个类的多个对象同时发送一个消息。例如老师会让多个学生同时交作业。在协作图中,多对象(multipleobject)用“一叠向后延伸的多个对象图标”来表示。在多对象前面可以加上用方括号括起来的条件,前面加一个星号,用来说明消息发送给多个对象。:学生:老师*[all]1:交作业()一个对象对多个对象发送消息有时按顺序发送消息是很重要的。例如,银行出纳员(bankclerk)要按照顾客排队的次序为每名顾客(customer)服务。可以用“while”条件表达出消息的顺序(例如lineposition=1…n)。:顾客:银行出纳员*[lineposition=1…n]1:服务()一个对象以指定的次序对多个对象发送消息4.2、返回结果消息可能是要求某个对象进行计算并返回结果的值。例如一个顾客对象可能请求一个计算器(calculator)对象计算某项商品的总价,包括该项商品的价格和税款。UML提供了返回值的表示法。返回值的名字在最左,后跟赋值号“:=”.接着是操作名和操作参数。对计算商品价格这个例子,可以表示成:totalPrice:=compute(itemPrice,salesTax)。下图说明了在协作图中返回值的表示法。表达式中赋值号的右边部分被称为消息构型(messagesignature).:计算器:顾客1:totalPrice:=compute(a,b)一个包含返回值表示法的协作图在一些交互中,控制流是由一个特定的对象控制的。这样的对象叫做主动对象(activeobject)。一个主动对象可以向被动对象发送消息也可以与其他主动对象交互。两个或者多个主动对象同时工作时的情形被称为开发(concurrency)。在协作图中,主动对象的表示法除了矩形边界要加黑加重外,其他方面与一般对象的表示法相同。

4.3、主动对象在图书馆的管理中。图书管理员(librarian)从主顾(patron)那里获得参考资料的信息,然后到数据库里查找这些参考资料,然后回复主顾提出的问题,指派工人(worker)进新书,一个图书馆管理员也要和执行相同任务的其他图书管理员交互。

:工人1:图书管理员4:进新书()主动对象控制消息系列:工人2:主顾1:参考资料的信息2:查找书名(书信息)3:返回信息(书名)4.4、同步有时遇到的另一种情况是一个对象只能等到其他一些对象发送了消息(可能是不连续的发送消息)后才能发送消息。也就是说,这个对象必须要“同步“自己发送的消息与其他对象发送的消息。下面的例子将说明什么是同步。假设这里的对象是一个公司里参与新产品的商业活动的人员。如下这些对象的交互序列:1、高级市场经理要求策划部经理为某一新产品制定一份促销计划。2、策划部经理制定了一份促销计划,并通知销售主管将这个任务指派给一个销售员。3、销售主管要求一个销售员根据销售计划销售产品。4、销售员与几位可能购买新产品的顾客通电话,向他们推销。5、在销售主管根据计划要求销售员执行后(也就是步骤3结束后),公司的对外事务专员在当地的一家报纸上发布了关于这次促销的广告。如何在顺序图中表示步骤5呢?UML同样为同步提供了表示法。不是在消息前加序号来表示同步,而是在需要同步的消息之前列出在这个消息之前要传递的消息序号,然后加上一个反斜杠。:销售主管:高级市场经理1:制定促销计划()协作图中的消息同步:策划部经理:销售员:顾客:对外事务专员:报纸2:分配计划()2:分配计划()3:卖产品()4:希望买产品3/登广告()1、概述活动图是状态机的一个变体,用来描述执行算法的工作流程中涉及的活动。活动状态代表了一个活动:一个工作流步骤或一个操作的执行。活动图描述了一组顺序的或并发的活动。2、活动图在UML中的表示方法活动图包括一些方便的速记符号,这些符号实际上可以用于任何状态图,尽管活动图和状态图的混合表示法多数时候都很难看。活动状态表示成带有圆形边线的矩形,它含有活动的描述(普通的状态盒为直边圆角)。简单的完成转换用箭头表示。和状态图相似,活动图也有起点和终点符号,表示法和状态图一样。活动1活动图图符集活动2●●2.1、判定可以用两种方式表示判定点。一种方式是从一个活动直接引出可能的路径。另一种方式是将活动的转移引到一个小的菱形图标,然后从这个菱形的图标中再引出可能的路径。无论用哪中方式,都必须在相关的路径附近指明引起这条路径被执行的条件,条件表达式要用方括号括起来。一个活动序列几乎总是要到达某一点,在这一点处要做出判定。一组条件引发一条执行路径,另一组条件则引发另一条执行路径,并且这两条执行条件是互斥的。判定的两种表示方式吃早餐接着睡觉●●闹钟响吃早餐接着睡觉●闹钟响●

[饿了][饿了][没饿][没饿]2.2、并发路径在对活动建模时,往往要将一个转移划分成两个单独的同时(并发)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论