第5章类图和对象图OO思想OO思想5.1类的定义什么是类(class)具有相似结构、行为和关系的一组对象的描述符类的组成属性操作UML中,类表示为划分为三格的矩形例,图形类Shape5.1.1属性属性的格式[可见性]属性名[:类型][‘[’多重性[次序]’]’][=缺省值][{特性}]可见性:可访问性多重性:属性值个数格式次序:属性值顺序特性:对该属性性质的一个约束说明,如{只读}选取类的属性时只考虑系统用到的特征,不必将所有属性都表示出来,原则上,由类的属性应能区分每个特定的对象。5.1.1属性可见性属性的可访问性,四类:公共(public)私有(private)保护(protected)实现(implementation)子类无法继承和访问父类的私有属性和实现属性5.1.1属性举例[可见性]属性名[:类型][‘[’多重性[次序]’]’][=缺省值][{特性}]+size:Area=(100,100)#visibility:Boolean=false-origin:Pointcolors:color[3]Points:Point[2..*ordered]Name:String[0..2]5.1.2操作标准格式:[可见性]操作名[(参数列表)][:返回值类型][{特性}]例:+display()#create()-attachXWindow(xwin:XWindowPtr)+getname():String提问:为何要规定可见性?信息隐藏(封装),双向保护如何阅读类图先看清有哪些类然后看类之间的关系结合多重性来理解类图的结构特点以及各属性、方法的含义阅读过程找出类Order、OrderItem、Customer、Consignee、DeliverOrder、Peddlery、Product找出关系从图中关系最复杂(也就是线最密集)的类开始阅读,如Order类OerderItem和Order之间是组合关系,根据箭头方向可知Order包含了OrderItemOrder类和Customer、Consignee、DeliverOrder是关联关系。也就是说,一个订单和客户、收货人、送货单是相关的。阅读过程多重性:用来说明关联的两个类之间的数量关系阅读过程理解方法Order类有两个方法dispatch()和close(),从名字中可以猜出它们分别实现“分发订单生成送货单”和“完成订单”。DeliveOrder类中有一个close()方法,同理,它表示“完成送货”。而在OrderItem中有一个stateChange()方法和deliverState,不难猜出它就是用于改变其“是否交给收货人”标志位的。先调用Order的dispatch()方法,它将根据其包含的OrderItem中产品信息,来按供应商户分拆成若干个DeliverOrder。商户登录系统后就可以获取其DeliverOrder,并在执行完成后再调用close()方法。此时,就将调用OrderItem的stateChange()方法来改变其状态。同时再调用Order的close()方法,判断该Order的所有的OrderItem是否都已经送到了,如果是就将其真正close()掉。5.2类的关系关联(accociation)泛化(generalization)实现(implementation)依赖(dependency)5.2.1关联关联(association)表示类与类之间的关系链(link)表示的是对象与对象之间的关系一个关联可以有两个或多个关联端(associationend),每个关联端连接到一个类。关联可以是单向的uni-directional或双向的bi-directional两个类之间的关联将在所生成的代码中体现出来,表现为类中有一个方法可以访问到另一个类5.2.1关联关联名用于明确表达关联的含义。客户?雇员?老板?可有可无动词短语斜体导航性(方向性)从一个类(对象)可以访问到另一个,反过来却不行,用带箭头的实线,表示单向关联,无箭头表示双向关联被关联的对象不知道谁与自己关联,但关联对象知道自己与谁有关联关联名CompanyPersonEmploy5.2.1关联publicclassA{publicBtheB;……publicA(){}}publicclassB{……publicB(){}}AB5.2.1关联关联角色(role)关联两端的类可以以某种角色参与关联。如果在关联上没有标出角色名,则隐含地用类名作为角色名。生成代码后会有和角色名相应的属性出现。自返关联通常必须标明角色。关联角色n表示多重性关联角色+表示可见性CompanyPerson0..n1+employer0..n#employee15.2.1关联关联角色的多重性(multiplicity)多重性表示可以有多少个对象参与该关联非负整数的子集表示0表示没有实例的关联,一般不用0..10..n1即1..13..61..nn一个教师可开设1到3门课程,一门课程可以有1到多个教师course的多重性teacher的多重性5.2.1关联关联类(associationclass)关联本身也可以有特性,通过建立关联类可以进一步描述关联的属性、操作和其他信息。通过虚线与关联连接。publicclassCompany{privateStringcompanyName;publicPersonemployee[];}publicclassPerson{privateStringpersonName;publicCompanyemployer;}publicclassContract{privateDoublesalary;}改成#,代码如何修改?5.2.1关联受限关联在关联端紧靠源类图标处可以有限定符(qualifier),带有限定符的关联称为受限关联或限定关联。限定符的作用就是在给定关联一端的一个对象和限定符之后,可以唯一确定另一端的一个对象或对象集。受限关联用于一对多或多对多的关联。将目标类的多重性从“多”降为“一”。Rose2003不能直接表示限定符。限定符5.2.1关联受限关联例:一客户可以在bank中有多个账户,但给定了一个账户account后,其只对应0..1个客户(bank,account)0..1个costomercostomer多个(bank,account)表达customer和bank之间的关系?nn5.2.1关联受限关联为何引入限定符?在设计软件时十分有用应用系统根据关键字对数据集作查询,常用到受限关联。引入限定符的一个目的就是把多重性从n降到1或0..1,则查询结果是单个对象,效率高。如果引入限定符后,另一端的多重性仍为n,则意义不大。5.2.1关联关联的约束/依赖约束是UML三种扩展机制之一:约束、版型、标记值给关联加上约束,可以加强关联的含义。PersonAccountCorporation{xor}5.2.1关联聚合(aggregation)has-a关系表达整体和部分的关系整体和部分的关系,个体可以属于多个整体。(聚合是特殊的关联)组合(composition)contains-a关系整体和部分的关系,个体唯一属于一个整体。组合关系中的“整体”控制着“部分”的生存期。组合是一种特殊的聚合关系,又称强聚合。FormButton5.2.1关联关联的种类自返关联二元关联N元关联5.2.1关联自返关联5.2.1关联二元关联和N元关联,大多数N元关联经过细致分析,都可转成二元关联。Rose2003不能直接表示N元关联。一个人在一个项目中可以使用多种开发语言;一个项目中使用某种语言的可以有多个开发者;一个开发者用某种语言可以开发多个项目。ProjectLanguagePersonprogrammernnn5.2.1关联Rose中演示几种关联在工具栏中选择定制customize…所有关联都可用画出,鼠标靠近不同的关联端右键单击,改变相应选项(如nevigate)可得到不同关联关系。组合关系是在聚合的基础上选“byvalue”选项5.2.1关联派生(Derived)关联一个关联是由另外的关联推导出来的,派生关联前面加斜杠表示。生成代码时,派生关联不产生相应代码。一个公司有多个部门,一个职员为其中某部门工作,则可推导该职员为该公司工作。5.2.2泛化Generalization,一般元素和特殊元素之间的关系。即OO语言中,类之间的继承关系斜体表示抽象类5.2.2泛化泛化的目的自顶向下的属性继承。可以使得子类共享父类的属性和操作,实现继承。自底向上的实例替换。可以使得子类的实例用于任何父类被声明使用的地方,实现多态。(派一个人来开会。学生、老师都可去开会。派一个老师来开会,若替换为派一个人去开会则有歧义)继承Rose中可以看到之类已继承了父类的属性private、implementation属性不被继承public、protected属性可被继承多态尽管每个之类的实现方法不同,但外界调用方式完全一样oLine-draw();5.2.2泛化抽象类(abstract,斜体表示):不能产生实例的类,因为类中的方法往往只是声明,而没有具体实现。5.2.3依赖一个元素B的改变会影响另外一个元素A,则称A依赖于B,二者之间存在依赖关系。客户提供者stereotype5.2.4实现一个元素完成另外一个元素的操作功能,则二者之间构成实现关系。如接口类及其实现;接口没有属性,只有声明的操作方法(对于方法没有实现部分),而由实现类具体定义实现部分。Rose中画法右键-options-版型显示IconLabelDecoration5.3类的划分三种类型边界类(Boundary)实体类(Entity)控制类(Control)5.3.1边界类位于系统与外界的交界处,例如窗体、对话框、报表、与外部设备或系统交互的类等等;边界类可以通过用例确定,因为活动者必须通过边界类参与用例;边界类一般可以没有属性,只有操作。存取款窗口转账窗口5.3.2实体类保存永久信息,类及其属性最终可能映射成数据库中的表以及字段。交易5.3.3控制类协调其他类工作和控制总体逻辑流程,一般每个用例有一个控制类。控制类会向其他类发送消息。完成用例的逻辑需求的类。5.4类图某校的类图练习一个教室有若干桌子,桌和椅一一对应,每个椅子坐两个人。派生关联:一个桌子可供两人使用。一个文件夹可以有多个子文件夹或多个文件,文件有的是加密的,有的是未加密的。5.4.1类图的抽象层次概念类描述应有领域中的概念,仅包含类名,不考虑细节;分析类分析不针对具体语言,包含一些类的细节特性设计类针对具体的语言,考虑类的实现细节5.4.2绘制类图步骤分析问题域,确定需求寻找类,确定类的含义和职责定义类的属性和操作确定类之间的关系精化类和类之间的关系绘制类图5.4.3寻找类(三种常用方法)1.使用名词/动词法分析寻找类收集相关信息补充的需求规格说明用例项目词汇表其他文档分析信息名词、名词短语类或属性动词、动词短语操作筛选、细化5.4.3寻找类2.使用CRC(classresponsibilitycollaboration)卡片分析法寻找类是一种根据类所要扮演的职责来确定类的方法头脑风暴收集信息关键业务用类表示,其他卡片作为属性或行为3.根据边界类、控制类和实体类的划分来帮助寻找系统中的类画UML图时,不必刻意将所有符号都用上,20%的符号可满足80%的建模要求。5.4.3寻找类确定潜在的对象类通常陈述中的名词或名词短语是可能的潜在对象类,它们以不同的形式展示出来,如:外部实体(如其他系统、设备和人员等),他