《类与对象关系建模.ppt》由会员分享,可在线阅读,更多相关《类与对象关系建模.ppt(229页珍藏版)》请在三一办公上搜索。
1、面向对象技术,第3讲 类与对象关系建模,内容提要,概念数据建模概述类图与对象图类的确定类间关系确定建模方法与实例,概念数据建模概述,在完成用例建模之后,便可以进行其他系统分析活动,而概念数据建模是最重要的分析活动之一。概念数据建模是对组织数据的描绘,它以一种独立于实现的方式说明了数据的结构和数据之间的相互关系,为后续的分析设计提供了基础。,概念数据建模概述,概念数据建模的过程,概念数据建模概述,概念数据建模在系统分析中的作用,概念数据建模概述,如何进行概念数据建模?必须包括以数据为中心的问题和调查,而不是以过程、逻辑或用户界面为中心,从对业务性质的透彻理解导出数据模型,也可以通过审查系统内部处
2、理的特定业务文档计算机显示、报表和业务表单来收集。开发准确而完整的数据模型要考虑的问题类:业务的主题/客体是什么?什么类型的人、地点、事物和材料被用于这个业务或者和这个业务交互?每个对象可能存在多少实例?,概念数据建模概述,如何进行概念数据建模?开发准确而完整的数据模型要考虑的问题(续)属性:需要维护关于对象的什么数据?什么特征描述各个对象?对象在什么基础上被引用、选择、限定、整理和分类?对象的一个特性能有多少个值?对给定的一个对象,特性是必须的还是可选的?标识符:什么独有特性区分相同类型的各个对象?这个区别特性是随着时间变化还是持久的?即使在我们知道一个对象存在的时候,该对象的这个特性可以缺
3、少吗?对象可以通过一个数字序列标识吗?关联、聚合和组合:对象之间存在什么关系?一个关系是部分整体的那种吗?如果是,一个对象可以在没有另一个时存在吗?一个关系中涉及了多个对象吗?关系是同类对象之间的吗?参与一个关系的对象的基数是什么?,概念数据建模概述,如何进行概念数据建模?开发准确而完整的数据模型要考虑的问题(续)泛化:一个对象是“一种”或另一个对象的“一种”吗?对象形成一个比较一般到比较特殊的层次吗?,概念数据建模概述,Mark咖啡机控制软件设计加热器,开关保温盘,开关保温盘传感器加热传感器冲煮按钮减压阀门,概念数据建模概述,Mark咖啡机控制软件设计基本接口,namespace Coffe
4、eMaker public enum WarmerPlateStatus/保温盘 WARMER_EMPTY,POT_EMPTY,POT_NOT_EMPTY public enum BoilerStatus/加热器 EMPTY,NOT_EMPTY public enum BrewButtonStatus/冲煮按钮 PUSHED,NOT_PUSHED public enum WarmerState/保温 ON,OFF public enum IndicatorState/指示灯 ON,OFF public enum ReliefValveState/减压阀 OPEN,CLOSED,概念数据建模概述
5、,Mark咖啡机控制软件设计基本接口,namespace CoffeeMaker public interface CoffeeMakerAPI WarmerPlateStatus GetWarmerPlateStatus();BoilerStatus GetBoilerStatus();BrewButtonStatus GetBrewButtonStatus();void SetBoilerState(BoilerState s);void SetWarmerState(WarmerState s);void SetIndicatorState(IndicatorState s);void
6、SetReliefValvelState(ReliefValvelState s);,概念数据建模概述,Mark咖啡机控制软件设计类设计,概念数据建模概述,Mark咖啡机控制软件设计存在问题如何实现这些类,只是一个函数调用的转换器,水蒸气类,public class Lightpublic void On()CoffeeMaker.api.SetIndicatorState(IndicatorState.ON);public void Off()CoffeeMaker.api.SetIndicatorState(IndicatorState.OFF);,概念数据建模概述,Mark咖啡机控制软件
7、设计存在问题虚构的抽象,public interface Heatervoid TurnOn();void TurnOff();,public interface Sensorint Sensor();,概念数据建模概述,Mark咖啡机控制软件设计如何改进:根据功能抽象,概念数据建模概述,Mark咖啡机控制软件设计如何改进:追加用户界面,类图的概念,对象是指与应用问题有一定关联的某个事物,或者说是对某个事物的抽象描述。类是对一类具有相同特性的对象的描述,或者说是类属事物或系统的表示形式。类可以具有状态(通过使用自己的特性数据来描述),并且可以提供功能(通过使用其操作或方法来表示),类图的概念,
8、类图描述类、接口、协作及它们之间关系的图。类图显示系统中各个类的静态结构。,类图的概念,类图中的图示元素:类(Class)接口(Interface)协作(Collaboration)依赖关系(Dependency)泛化关系(Generalization)关联关系(Association)实现关系(Realization),类,面向对象系统组织结构的核心。对一组具有相同属性、操作、关系和语义的对象的抽象。包括名称部分、属性部分和操作部分。,类,Dialer类,Public class Dialer private string digits;private int nDigits;public
9、void Digit(int n);protected bool RecordDigit(int n);,类,类的名称应该来自系统的问题域。应该是一个名词,且不应该有前缀或后缀。分为简单名称和路径名称。,类,属性描述了类在软件系统中代表的事物(即对象)所具备的特性。类可以有任意数目的属性,也可以没有属性。在UML中,类属性的语法为:可见性 属性名:类型=初始值 属性字符串,类,属性可见性公有(Public)“”私有(Private)“”受保护(Protected)“”,类,属性属性名每个属性都必须有一个名字以区别于类中的其他属性。属性名由描述所属类的特性的名词或名词短语组成。单字属性名小写,如
10、果属性名包含了多个单词,这些单词要合并,且除了第一个单词外其余单词的首字母要大写。,类,属性类型简单类型:整型布尔型实型枚举类型系统中的其他类,类,属性初始值目的:保护系统的完整性,防止漏掉取值或被非法的值破坏系统的完整性。为用户提供易用性。,类,属性属性字符串指定关于属性的其他信息,往往是约束条件。任何希望添加在属性定义字符串值但又没有合适地方可以加入的规则,都可以放在属性字符串里。实例Name:string readonly,类,操作对类的对象所能做的事务的抽象。一个类可以有任意数量的操作或者根本没有操作。返回类型、名称和参数一起被称为操作签名。在UML中,类操作的语法为:可见性 操作名(
11、参数表):返回类型 属性字符串,类,操作可见性公有(Public)“”私有(Private)“”受保护(Protected)“”包内公有(Package)“”,类,操作操作名用来描述所属类的行为的动词或动词短语。单字操作名小写,如果操作名包含了多个单词,这些单词要合并,并且除了第一个单词外其余单词的首字母要大写。,类,操作参数表一些按顺序排列的属性定义了操作的输入。是可选的,即操作不一定必须有参数才行。定义方式:“方向 名称:类型默认值”。若存在多个参数,将各个参数用逗号隔开。参数可以具有默认值。,类,操作返回类型是可选的,即操作不一定必须有返回类型。绝大部分编程语言只支持一个返回值。具体的编
12、程语言一般要加一个关键字void来表示无返回值。,类,操作属性字符串在操作的定义中加入一些除了预定义元素之外的信息。往往也是定义约束,类,职责类或其他元素的契约或义务。以自由形式的文本形式存在,即非形式化的方法来描述。,职责内容,类,约束指定了类所要满足的一个或多个规则。形式化的方法。,类,注释 注释可以包含图形也可以包含文本。,类,范例,接口与抽象类,接口在没有给出对象的实现和状态的情况下对对象行为的描述。包含操作但不包含属性。一个类可以实现一个或多个接口。,接口与抽象类,接口类:,接口与抽象类,抽象类是一种不能够被直接实例化的类,也就是说不能够创建一个属于抽象类的对象,接口与抽象类,抽象类
13、实例,类之间的关系,依赖关系泛化关系关联关系实现关系,类之间的关系,依赖关系表示两个或多个模型元素之间语义上的关系。客户以某种形式依赖于提供者。关联、实现和泛化都是依赖关系。,类之间的关系,依赖关系如果两个类的对象之间存在着下面的情形,且两个类之间不存在结构方面的联系(例如:供应类以成员变量的形式作为客户类的一部分),就可以建模成为具有依赖关系,这些情形是:(1)客户类访问定义在供应类内部的值(常量或 变量)。(2)客户类的操作启动了定义在供应类内的操作。(3)客户类的返回类或参数是供应类的实例。序列图中的两个对象,如果存在着消息的发送。且它们之间又没有结构方面的连接,就可以在类图上用依赖关系
14、对它们建模。,类之间的关系,泛化关系存在于一般元素和特殊元素间的分类关系。可以用于类、用例以及其他模型元素。描述了一种“is a kind of”的关系。,类之间的关系,泛化关系范例,public class Employeepublic class SalariedEmployee:Employee,类之间的关系,泛化关系泛化主要用途:多态:后代的实例可以用于任何祖先被声明使用的地方,从而使多态操作成为可能,即操作的实现方法由实际对象的类来确定继承:共享祖先描述,并允许对元素进行增量描述单继承多重继承,类之间的关系,泛化关系泛化主要用途:,类之间的关系,泛化关系泛化主要用途:,类之间的关系,
15、泛化关系泛化主要用途:,类之间的关系,关联关系一种结构关系。指明事物的对象之间的联系。最普通的关联是二元关联。,类之间的关系,关联关系范例,public class phoneprivate Button itsButtons15,类之间的关系,关联关系关联关系并不是仅仅一个抽象的概念,它在实现为程序设计语言源代码时,会有对应的映射。通常,当把两个有关联关系的类映射为特定的程序设计语言代码时,每一个类都会被定义为一个可以引用对方的类的对象的成员变量,这个成员变量视对关联关系的修饰的不同,可能会采取不同的形式,如:它可以指向对方的类的指针,也可能是对方类的对象。,类之间的关系,关联关系,类之间的
16、关系,关联关系名称(Name)角色(Role)多重性(Multiplicity)聚合关系(Aggregation)组合关系(Composition)导航性(Navigation),类之间的关系,关联关系名称(Name)使用一个动词或动词短语来命名关联。清晰而简洁地说明对象间关系。关联的名称并不是必需的。可以前缀或后缀一个指引阅读方向的方向指示符,以消除歧义。,类之间的关系,关联关系角色(Role)关联关系中一个类对另一个类所表现出来的职责。角色的名称应该是名词或名词短语,以解释对象是如何参与关系的。,类之间的关系,关联关系多重性(Multiplicity)指有多少对象可以参与该关联。可以表达一
17、个取值范围、特定值、无限定的范围或一组离散值。格式:“minimum.maximum”(均为Int型)。赋给一个端点的多重性表示该端点可以有多少个对象与另一个端点的一个对象关联。,类之间的关系,关联关系聚合关系(Aggregation)一种特殊类型的关联。表示整体与部分关系的关联。描述了“has a”的关系。,类之间的关系,关联关系组合关系(Composition)聚合关系中的一种特殊情况,是更强形式的聚合,又称强聚合。成员对象的生命周期取决于聚合的生命周期。聚合不仅控制着成员对象的行为,而且控制着成员对象的创建和解构。,类之间的关系,关联关系导航性(Navigation)描述一个对象通过链进
18、行导航访问另一个对象。使用导航性可以降低类间的耦合度。包括:单向关联和双向关联。,类之间的关系,关联关系,类之间的关系,关联关系,类之间的关系,关联关系关联类:在有些问题中,关联关系不仅需要一个名称、需要定义相关对象的角色及其参与这些角色的对象数量(多重性),而且还需要设置一些属性、操作以及其它特性,此时一般需要引入关联类。,类之间的关系,关联关系关联类,类之间的关系,实现关系规格说明和其实现之间的关系。客户必须至少支持提供者的所有操作。泛化和实现都可以将一般描述与具体描述联系起来:泛化将同一语义层上的元素连接起来,并且通常在同一模型内。实现将不同语义层内的元素连接起来,并且通常建立在不同的模
19、型内。,类,类图实例,类,类图说明标识符:是一个属性或属性组合,它被选择用作一个类的唯一特征。多值属性:可以具有多于一个的值,在概念设计期间处理多值属性有两种方法:多值构造型;为多值属性创建一个类;组合属性:具有多个子属性的属性,例如地址,类,类图说明,分析类,如何发现类类的种类:实体类边界类控制类实体类:实体类的判别特征是它的对象持有应用的大部分数据,一般实体类的对象是持久的,也就是说它们的存在超过一个会话的生命期,或者有时存在于系统的整个生命期间。,分析类,如何发现类边界类:参与者用边界类的对象与系统交互,例如表单、对话框、菜单和其他交互屏幕等,边界类还可以用于建立与另一个系统的通信,例如
20、遗留系统。因此边界类将系统与系统外部的变化隔离开。控制类:协调任务并捕捉用例中的主要应用逻辑。,分析类,如何发现类通过事件流寻找类(名词动词分析法)分析事件流中的名词,将性质相同的归为一类;去除不恰当的或含糊的,去除应归为属性的项目。命名所获取的类。,分析类,如何发现类如何确定属性注意需求中的名词;注意用例模型或需求文档中的名词,数据表。如何确定方法实现:实现业务功能,通过事件流中的动词分析进行捕捉;管理:管理对象的创建或构造;访问:查询或修改每个类的属性;帮助:说明类完成任务所需要的操作。,分析类,需求描述小王是一个爱书之人,家里各类书籍已过千册,而平时又时常有朋友外借,因此需要一个个人图书
21、管理系统。该系统应该能够将书籍的基本信息按计算机类、非计算机类分别建档,实现按书名、作者、类别、出版社等关键字的组合查询功能。在使用该系统录入新书籍时系统会自动按规则生成书号,可以修改信息,但一经创建就不允许删除。该系统还应该能够对书籍的外借情况进行记录,可对外借情况列表打印。另外,还希望能够对书籍的购买金额、册数按特定时间周期进行统计,分析类,发现类小王是一个爱书之人,家里各类书籍已过千册,而平时又时常有朋友外借,因此需要一个个人图书管理系统。该系统应该能够将书籍的基本信息按计算机类、非计算机类分别建档,实现按书名、作者、类别、出版社等关键字的组合查询功能。在使用该系统录入新书籍时系统会自动
22、按规则生成书号,可以修改信息,但一经创建就不允许删除。该系统还应该能够对书籍的外借情况进行记录,可对外借情况列表打印。另外,还希望能够对书籍的购买金额、册数按特定时间周期进行统计,分析类,筛选备选类“小王”、“人”、“家里”很明显是系统外的概念,无须对其建模;而“个人图书管理系统”、“系统”指的就是将要开发的系统,即系统本身,也无须对其进行建模;很明显“书籍”是一个很重要的类,而“书名”、“作者”、“类别”、“出版社”、“书号”则都是用来描述书籍的基本信息的,因此应该作为“书籍”类的属性处理,而“规则”是指书号的生成规则,而书号则是书籍的一个属性,因此“规则”可以作为编写“书籍”类构造函数的指
23、南。“基本信息”则是书名、作者、类别等描述书籍的基本信息统称,“关键字”则是代表其中之一,因此无需对其建模;“功能”、“新书籍”、“信息”、“记录”都是在描述需求时使用到的一些相关词语,并不是问题域的本质,因此先可以将其淘汰掉;,分析类,筛选备选类“计算机类”、“非计算机类”是该系统中图书的两大分类,因此应该对其建模,并改名为“计算机类书籍”和“非计算机类书籍”,以减少歧义;“外借情况”则是用来表示一次借阅行为,应该成为一个候选类,多个外借情况将组成“外借情况列表”,而外借情况中一个很重要的角色是“朋友”借阅主体。虽然到本系统中并不需要建立“朋友”的资料库,但考虑到可能会需要列出某个朋友的借阅
24、情况,因此还是将其列为候选类。为了能够更好地表述,将“外借情况”改名为“借阅记录”,而将“外借情况列表”改名为“借阅记录列表”;“购买金额”、“册数”都是统计的结果,都是一个数字,因此不用将其建模,而“特定时限”则是统计的范围,也无需将其建模;不过从这里的分析中,我们可以发现,在该需求描述中隐藏着一个关键类书籍列表,也就是执行统计的主体。,分析类,得到候选类在使用“名词动词法”寻找类的时候,很多团队会在此耗费大量的时间,特别是对于中大型项目,这样很容易迷失方向。其实在此主要的目的是对问题领域建立概要的了解,无需太过咬文嚼字,类的设计原则的方法,1.单一职责原则(SRP)含义:就一个类而言,应该
25、仅有一个引起它变化的原因。范例说明:,类的设计原则的方法,1.单一职责原则(SRP),类的设计原则的方法,1.单一职责原则(SRP),类的设计原则的方法,1.单一职责原则(SRP)总结SRP是所有原则中最简单的原则之一;也是最难正确应用的原则之一。,类的设计原则的方法,2.开放封闭原则(OCP)含义:软件实体应该是可以扩展的,但是不可修改的;对于扩展是开放的,对于修改是封闭的。范例说明:,类的设计原则的方法,2.开放封闭原则(OCP),类的设计原则的方法,3.Liskov替换原则(LSP)含义:子类型必须能够替换掉它们的基类型。替换性质:若对于每个类型S的对象O1,都存在一个类型T的对象O2,
26、使得在所有针对T编写的程序P中,用O2替换O1后,程序P行为功能不变,则S是T的子类型。,类的设计原则的方法,3.Liskov替换原则(LSP)范例1:不满足LSP,Struct Pointdouble x,y;public enum ShapeType square,circle;public class Shape private ShapeType type;public Shape(ShapeType t)tpye=t;public static void DrawShape(Shape s)if(s.type=ShapeType.square)(s as Square).Draw()
27、;else if(s.type=ShapeType.circle)(s as Circle).Draw();,类的设计原则的方法,3.Liskov替换原则(LSP),public class Circle:Shape private Point center;private double radius;public Circle():base(ShapeType.circle)public void Draw()/*Draw the circle*/public class Square:Shape private Point topleft;private double side;publi
28、c Square():base(ShapeType.square)public void Draw()/*Draw the square*/,类的设计原则的方法,3.Liskov替换原则(LSP)范例2:不满足LSP,类的设计原则的方法,3.Liskov替换原则(LSP)总结OCP是面向对象设计的核心原则LSP是使OCP成为可能的主要原则之一,类的设计原则的方法,4.依赖倒置原则(DIP)含义:高层模块不应依赖于低层模块,二者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。范例说明:,类的设计原则的方法,4.依赖倒置原则(DIP),类的设计原则的方法,4.依赖倒置原则(DIP)任何
29、变量都不应该持有一个指向具体类的引用任何类都不应该从一个具体类派生任何方法不应该重写它的任何基类中的已经实现了的方法,类的设计原则的方法,4.依赖倒置原则(DIP)范例1:存在问题,类的设计原则的方法,4.依赖倒置原则(DIP)范例1:存在问题,类的设计原则的方法,5.接口隔离原则(DIP)含义:不应该强迫客户依赖于它们不用的方法。接口属于客户,不属于它所在的类层次结构。范例说明:,类的设计原则的方法,5.接口隔离原则(DIP),使用委托分离接口,类的设计原则的方法,5.接口隔离原则(DIP),使用多重继承分离接口,对象图,描述参与一个交互的各个对象在交互过程中某一时刻的状态。可以被看作是类图
30、在某一时刻的实例。,类图和对象图的区别,对象图范例,对象图范例,对象图的应用,论证类模型的设计:当设计了类模型时,你可以通过对象图来模拟出一个运行时的状态,这样就可以研究在运行时设计的合理性。同时,也可以作为开发人员讨论的一个基础。分析和说明源代码:由于类图只是展示了程序的静态类结构,因此通过类图看懂代码的意图是很困难的。因此在分析源代码时,可以通过对象图来细化分析。而对于开发人员,对于逻辑较复杂的类交互时,可以考虑画出一些对象图来做补充说明,交互的概念,一次交互就是指在特定语境中,为了实现某一个目标,而在一组对象之间进行交换的一组消息所表示的行为,如何创建交互图,用例图仅仅描述了系统的功能,
31、以及功能的执行流程。它并没有从实现的层面来描述系统。而要对用例进行实现描述,则需要描述相互影响的对象的集合,这些对象用来支持用例所要求的功能。并且,给出系统用例的实现描述,是从外部视图转到内部结构的第一步。在UML中,用例的实现用交互图来描述,它通过显示对象之间的关系和对象之间处理的消息来对系统的动态特性建模。交互图包括序列图和协作图两种。,如何创建交互图,交互图用来一步一步地描述用例地实现流程,包括流中需要什么对象,对象之间发送什么,什么角色启动流、消息按什么顺序发送等。交互图通过从用例建模中得到的用例文档说明、词汇表和用例图来创建。,如何创建交互图,范例以选课系统中的选课用例(Select
32、 Course)为例,来获取对象和角色。分析:为了使问题更简单一些,不考虑学生的登录。假设学生已经成功登录系统,选课的事件流如下:(1)学生进入选课主界面。(2)学生点击选课。(3)系统显示所有课程信息。(4)学生选择课程。(5)系统验证课程是否可选。A1:课程不可选(6)系统提示课程选择成功,提示学生交费。(7)用例结束。,如何创建交互图,范例A1:课程不可选(1)系统捉示课程不可选及原因。(2)学生重新选课。(3)重新验证直至成功。(4)转选课事件流第6步。查找Select Course用例的对象。从事件流中发现涉及以下对象:(1)界面。(2)课程。(3)对于业务层的操作,也应该有对象进行
33、处理,称其为业务对象。(4)事件流中设计的角色有:学生、数据库。,时序图,概念时序图是强调消息时间顺序的交互图。时序图描述了对象之间传送消息的时间顺序,用来表示用例中的行为顺序。时序图将交互关系表示为一个二维图。其中,纵轴是时间轴,时间沿竖线向下延伸。横轴代表了在协作中各独立的对象。,时序图,概念,时序图,时序图包含了4个元素:对象(Object)生命线(Lifeline)消息(Message)激活(Activation),时序图,对象(Object)时序图中对象的符号和对象图中对象所用的符号一样。将对象置于时序图的顶部意味着在交互开始的时候对象就已经存在了,如果对象的位置不在顶部,那么表示对
34、象是在交互的过程中被创建的。,时序图,生命线(Lifeline)生命线是一条垂直的虚线,表示时序图中的对象在一段时间内的存在。每个对象的底部中心的位置都带有生命线。生命线是一个时间线,从时序图的顶部一直延伸到底部,所用的时间取决于交互持续的时间。对象与生命线结合在一起称为对象的生命线,对象的生命线包含矩形的对象图标以及图标下面的生命线。,时序图,消息(Message)消息定义的是对象之间某种形式的通信,它可以激发某个操作、唤起信号或导致目标对象的创建或撤销。消息是两个对象之间的单路通信,从发送方到接收方的控制信息流。消息可以用于在对象间传递参数。消息可以是信号,也可以是调用。在UML中,消息使
35、用箭头来表示,箭头的类型表示了消息的类型。,时序图,消息(Message),时序图,激活(Activation)激活表示该对象被占用以完成某个任务,去激活指的则是对象处于空闲状态、在等待消息。在UML中,为了表示对象是激活的,可以将该对象的生命线拓宽成为矩形。其中的矩形称为激活条或控制期,对象就是在激活条的顶部被激活的,对象在完成自己的工作后被去激活。,时序图,对象的创建和撤销如果对象位于时序图的顶部,说明在交互开始之前该对象已经存在了。如果对象是在交互的过程中创建的,那么它应当位于图的中间部分。对象在创建消息发生之后才能存在,对象的生命线也是在创建消息之后才存在的。创建对象的两种表示方法:,
36、时序图,对象的创建和撤销如果要撤销一个对象,只要在其生命线终止点放置一个“X”符号即可,该点通常是对删除或取消消息的回应。,时序图,时序图建模技术确定需要建模的工作流从左到右布置对象添加消息和条件以便创建每一个工作流绘制总图以便连接各个分图,时序图,范例1,时序图,范例1确定将要建模的工作流教师成功地检查学生分数教师试图检查学生分数,单学生不在系统中教师试图检查学生分数,但该学生分数不在系统中,时序图,范例1布置对象,时序图,范例1添加消息和条件(流程1),时序图,范例1添加消息和条件(流程2),时序图,范例1添加消息和条件(流程3),时序图,范例2,时序图,范例3系统管理员添加书籍的时序图,
37、时序图,范例3图书管理员处理借书的时序图(不包括预留书籍的情况),时序图,范例3系统管理员删除书目的时序图,时序图,范例3借阅者预留书籍的时序图,时序图,范例4分析Select Course用例中的对象、角色之间交互的消息。主要有以下交互:(1)学生通过界面发送选课命令。(2)界面向控制对象请求课程信息。(3)控制对象向数据库发送查询数据消息。(4)控制对象暂存数据库的查询结果。(5)界面对象从控制对象中取得所有的课程信息。(6)在界面上显示所有的课程信息。,时序图,范例4分析Select Course用例中的对象、角色之间交互的消息。主要有以下交互:(7)界面对象发送命令要求控制对象删除课程
38、信息。(8)学生选择课程。(9)界面对象要求学生输入学号。(10)界面对象向控制对象发送信息,查询该生是否可以选择选定的课程。(11)控制对象从数据库中查询关联信息。(12)控制对象判断是否可以选课。(13)如果可以选课,则向数据库中添加关联信息。(14)向界面对象返回信息。,时序图,范例4,协作图,概念协作图描述的是和对象结构相关的信息。协作图的用途是表示一个类操作的实现。协作图对交互中有意义的对象和对象之间的链建模。在UML中,协作图用几何排列来表示交互作用中的对象和链,附在链的箭头代表消息,消息的发生顺序用消息箭头处的编号来说明。,协作图,概念,协作图,协作图包含了3个元素:对象(Obj
39、ect)链(Link)消息(Message),协作图,对象(Object)协作图与时序图中的对象的概念是一样,只不过在协作图中,无法表示对象的创建和撤销,所以对于对象在图中的位置没有限制。,协作图,链(Link)协作图中链的符号和对象图中链所用的符号是一样的,即一条连接两个类角色的实线。为了说明一个对象如何与另一个对象连接,可以在链的末路上附上一个路径构造型。,协作图,消息(Message)协作图中的消息类型与时序图中的相同,只不过为了说明交互过程中消息的时间顺序,需要给消息添加顺序号。顺序号是消息的一个数字前缀,是一个整数,由1开始递增,每个消息都必须由唯一的顺序号。可以通过点表示法代表控制
40、的嵌套关系。嵌套可以具有任意深度。与时序图相比,协作图可以显示更为复杂的分支。,协作图,关联角色:是一种协作角色,用来说明协作图中两个分类器角色之间的关系。它由两个类角色元素之间的路径表示,并且可以包括带下划线的相应关联的名称。在协作图上下文中,关联角色通常指链接。,协作图,时序图与协作图的互换时序图与协作图都表示对象之间的交互作用,只是它们的侧重点有所不同:时序图描述了交互过程中的时间顺序,但没有明确地表达对象之间的关系。协作图描述了对象之间的关系,但时间顺序必须从顺序号获得。两种图的语义是等价的,可以从一种形式的图转换成另一种形式的图,而不丢失任何信息。例如rose中就提供了直接由时序图生
41、成协作图的功能。,协作图,协作图建模技术设置交互的语境。通过识别对象在交互中扮演的角色,设置交互的场景。对每个对象设置初始特性。描述对象之间可能有信息沿着它传递的链。从引起交互的消息开始,适当地设置其顺序号,然后将随后的每个消息附到适当的链上。如果需要说明时间或空间约束,可以用时间标记修饰这个消息,并附上合适的时间和空间约束。如果需要更形式化地说明这个控制流,可以为每个消息附上前置和后置条件。,协作图,绘制协作图的步骤创建协作图协作图工具栏按钮简介添加对象添加消息添加数据流,协作图,范例1系统管理员添加书籍的协作图,协作图,范例1图书管理员处理借书的协作图,协作图,范例1图书管理员处理还书的协
42、作图,协作图,范例1系统管理员删除书籍的协作图,协作图,范例1借阅者预留书籍的协作图,协作图,范例2Select Course用例对象之间的交互包括:学生通过界面发送选课命令;界面向控制对象请求课程信息;控制对象向数据库发送查询数据消息;控制对象暂存数据库的查询结果;界面对象从控制对象中取得所有的课程信息;在界面上显示所有的课程信息;界面对象发送命令要求控制对象删除课程信息;,协作图,范例2Select Course用例对象之间的交互包括:学生选择课程;界面对象要求学生输入学号;界面对象向控制对象发送信息,查询该生是否可以选择选定的课程;控制对象从数据库中查询关联信息;控制对象判断是否可以选课
43、;如果可以选课,则向数据库中添加关联信息;向界面对象返回信息。,协作图,范例2,交互图,面向对象分析步骤,用例建模,概念建模,交互建模,分析类建模,交互图,顺序图绘制注意事项参与者只能与边界对象通信边界对象只能与控制器和参与者通信实体对象只能与控制器通信控制器可以与边界对象和实体对象通信,但不能与参与者通信,控制器还可以与其他控制器通信。,类图作业,单人骰子游戏游戏者通过系统可以进行骰子游戏,即先后掷两个骰子,如果点数之和大于7则游戏者胜。游戏者可以查询从游戏开始到当前自己胜的次数,输的次数。画出用例图、概念类图、时序图、类图、以及用代码实现。,类图作业,单人骰子游戏,类图作业,单人骰子游戏,
44、类图作业,单人骰子游戏,状态图,状态机概念状态机是展示状态与状态转换的图。状态机包含了一个类的对象在其生命期间所有状态的序列以及对象对接受到的事件所产生的反应。利用状态机可以精确地描述对象的行为。,状态图,状态图概念一个状态图表示一个状态机。状态图表现从一个状态到另一个状态的控制流。状态图由表示状态的节点和表示状态之间转换的带箭头的直线组成。,状态图,状态图组成:状态(State)转换(Transition)初始状态(Start State)终结状态(End State)判定(Decision),状态图,范例,状态图,状态状态图中的状态一般是给定类对象中的一组属性值,这组属性值是对象所有属性的
45、子集。在对系统建模时,我们可以只关心那些明显影响对象行为的属性以及由他们表达的对象状态,而不用理睬那些于对象行为无关的状态。,状态图,状态状态种类:简单状态(Simple State)组成状态(Composite State)状态组成:状态名(Name)活动(Activity)入口动作(Entry Action)出口动作(Exit Action,状态图,状态状态由一个带圆角的矩形表示。状态图标可以分为三部分:名称内部转换嵌套状态,状态图,状态状态名状态名表示状态的名字,通常用字符串表示。一个状态的名称在状态图所在的上下文中应该是唯一的。不过,状态允许匿名。状态的名字通常放在状态图标的顶部,状态
46、图,状态内部转换内部转换只有一个源状态而没有目标状态,因此转换激发的结果并不改变状态本身。如果一个内部转换带有动作,动作也要被执行,但是由于没有状态改变发生,因此不需要执行入口和出口动作。内部转换和自转换不同,虽然两者都不改变状态本身,但是自转换会激发入口动作和出口动作的执行,而内部转换却不会。,状态图,状态入口动作与出口动作入口动作和出口动作表示进入或退出这个状态所要执行的动作。入口动作用“entry/要执行的动作”表达,而出口动作用“exit/要执行的动作”表达,状态图,状态简单状态简单状态是指不包含其他状态的状态。简单状态没有子结构,但它可以具有内部转换、入口动作和出口动作等。,状态图,
47、状态组成状态组成状态是可以包含一些嵌套的子状态的状态。组成状态可以使用“与”关系分解为并发子状态,或者通过“或”关系分解为互相排斥的顺序子状态。组成状态的一个入转换代表对其嵌套子状态区域内的初始状态的入转换;对嵌套子状态区域内的终结状态的转换代表包含它的终止状态的相应活动的完成。,状态图,初始状态初始状态代表状态图的起始位置,只能作为转换的源,而不能作为转换的目标。初始状态在一个状态图中只允许有一个,它用一个实心的圆表示。,状态图,终止状态终止状态是模型元素的最后状态,是一个状态图的终止点。终止状态只能作为转换的目标,而不能作为转换的源。终止状态在一个状态图中可以有多个,它用一个套有一个实心圆
48、的空心圆表示。,状态图,事件事件表示在某一特定的时间或空间出现的能够引发状态改变的一种运动变化。事件是一个激励的出现,它定义一个触发子以触发对象改变其状态,任何影响对象的事物都可以是事件。,状态图,事件事件种类:入口事件入口事件表示一个入口的动作序列,它在进入状态时执行。入口事件的动作是原子的,并且先于人和内部活动或转换。,状态图,事件事件种类:出口事件出口事件表示一个出口的动作序列,它在退出状态时执行。出口事件也是原子的,它跟在所有的内部活动之后,但是先于所有的出口转换。,状态图,事件事件种类:动作事件动作事件也称为“do事件”,它表示对一个嵌套状态机的调用。与动作事件相关的活动必定引用嵌套
49、状态机,而非引用包含它的对象的操作。,状态图,转换转换表示当一个特定事件发生或者某些条件得到满足时,一个源状态下的对象在完成一定的动作后将发生状态转变,转向另一个称之为目标状态的状态。转换进入的状态为活动状态,转换离开的状态变为非活动状态。,状态图,转换转换用带箭头的直线表示,一端连接源状态即转出的状态,箭头一端连接目标状态即转入的状态。转换可以标注与此转换相关的选项如事件、动作和监护条件。,状态图,触发事件触发事件是能够引起状态转换的事件。触发事件可以是信号、调用、时间段等。,状态图,监护条件监护条件是触发转换必须满足的条件,它是一个布尔表达式。监护条件只能在触发事件发生时被赋值一次,如果在
50、转换发生后监护条件才由假变为真,那么转换也不会被触发。从一个状态引出的多个转换可以有同样的触发器事件,但是每个转换必须具有不同的监护条件。,状态图,动作动作是一组可执行语句或者计算处理过程。动作可以包括发送消息给另一个对象、操作调用、设置返回值、创建和销毁对象等。动作是原子的,不可中断的,动作或动作序列的执行不会被同时发生的其他动作影响或终止。整个系统可以在同一时间执行多个动作。,状态图,判定判定在状态图中的位置:工作流在此处按监护条件的取值而发生分支。判定用空心小菱形表示。,状态图,判定因为监护条件为布尔表达式,所以通常条件下的判定只有一个入转换和两个出转换。根据监护条件的真假可以触发不同的