第6章类图和对象图-郭.ppt

上传人:本田雅阁 文档编号:2257451 上传时间:2019-03-12 格式:PPT 页数:130 大小:2.77MB
返回 下载 相关 举报
第6章类图和对象图-郭.ppt_第1页
第1页 / 共130页
第6章类图和对象图-郭.ppt_第2页
第2页 / 共130页
第6章类图和对象图-郭.ppt_第3页
第3页 / 共130页
亲,该文档总共130页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《第6章类图和对象图-郭.ppt》由会员分享,可在线阅读,更多相关《第6章类图和对象图-郭.ppt(130页珍藏版)》请在三一文库上搜索。

1、第6章 类图和对象图,6.1 类图的概念 6.2 类图建模技术 6.3 对象图 6.4 补充:分析类,类图,类图描述系统中类的静态结构,描述系统中的类及类之间的关系,还描述类的内部结构(类的属性和操作)。 类图描述的是一种静态关系,在系统的整个生命期中都是有效的。 对象图是类图的实例,由于对象存在生命周期,所以对象图只能在系统的某一时间存在。,类图的地位,类图是面象对象系统建模中最常用的图。 类图是定义其它图的基础,在类图的基础上,可以使用状态图、协作图、组件图和配置图等进一步描述系统其它方面的特征。 类图中的类可以直接用某种面向对象编程语言实现。,6.1 类图的概念,描述类、接口及它们之间关

2、系的图。 显示系统中各个类的静态结构。,6.1.1 概述,类图的元素: 类(Class) 接口(Interface) 依赖关系(Dependency) 泛化关系(Generalization) 关联关系(Association) 实现关系(Realization),6.1.2 类,类是构成类图的基础,也是面向对象系统组织结构的核心。 类是对一组具有相同属性、操作、关系和语义的对象的抽象。 类包括名称部分(Name)、属性部分(Attribute)和操作部分(Operation)。 UML规范采用一个具有3个分栏的图标表示一个类。,名称分栏必须出现,而属性分栏和操作分栏可以出现或不出现。 当隐藏

3、某个分栏时,并非表明某个分栏不存在。,隐藏操作参数,隐藏可见性,6.1.2 类,1 名称 2 属性 3 操作 4 职责 5 约束 6 注释,(1)名称,应该来自系统的问题域。 应该是一个名词。 分为简单名称和路径名称。,(2)属性,描述了类在软件系统中代表的事物(即对象)所具备的特性。 类可以有任意数目的属性,也可以没有属性。 在UML中,类属性的语法为:,1. 可见性,可见性描述了该属性对其它类是否可见,以及是否可以被其它类引用。 类型: 公有(Public) “” 私有(Private)“” 受保护(Protected)“”,注意: UML未规定默认的可见性,如果没有给出,表明该属性的可见

4、性尚未定义。,2. 属性名,每个属性都必须有一个名字以区别于类中的其他属性。 属性名由描述所属类的特性的名词或名词短语组成。 单字属性名小写,如果属性名包含了多个单词,这些单词要合并,且除了第一个单词外其余单词的首字母要大写。 -建议,3. 类型,简单类型: 整型 布尔型 实型 枚举类型 系统中的其他类,4. 初始值,目的: 保护系统的完整性,防止漏掉取值或被非法的值破坏系统的完整性。 为用户提供易用性。,5. 属性字符串,属性字符串是用户对该属性性质的一个约束说明。 例如 只读这样的特性说明该属性的值不能被修改。 任何希望添加在属性定义字符串值但又没有合适地方可以加入的规则,都可以放在属性字

5、符串里。 +status:Status=unpaidunpaid,paid +color:Color=redred,green,yellow,确定取值范围,补充:作用域,作用域(scope)是与属性和操作相关的一个重要概念。 存在两种作用域: 实例(instance)作用域下,类的每个实例对象都有自己的属性值和操作。 分类符(classifier)作用域下,一个类的所有实例只存在一个属性值和操作。分类作用域的属性和操作名字要带下划线。,类的作用域属性:,分类作用域的属性,它能被所属类的所有对象共享。,例如:C+中的静态成员,静态属性,属性声明的例子,Points属性的多重性为2*,表示该属性值

6、有2个或者多个,同时这些值之间是有序的。,Name属性的多重性为02,表示该属性值有可能是1个或者2个,也可能值为null。,(3)操作,对类的对象所能做的事务的抽象。 一个类可以有任意数量的操作或者根本没有操作。 返回类型、名称和参数一起被称为操作签名。 在UML中,类操作的语法为:,操作,1. 可见性 2. 操作名 3. 参数表 4. 返回类型 5. 特性字符串,1. 可见性,类型: 公有(Public) “” 私有(Private) “” 受保护(Protected) “” 包内公有(Package) “”,包内公有(Package)“” 包内公有用来描述操作的可访问性的 可见性为包内公

7、有的操作可以被其所在包的对象访问。,2. 操作名,用来描述所属类的行为的动词或动词短语。 单字操作名小写,如果操作名包含了多个单词,这些单词要合并,并且除了第一个单词外其余单词的首字母要大写。,3. 参数表,一些按顺序排列的属性定义了操作的输入。 是可选的,即操作不一定必须有参数才行。 定义方式:“名称:类型”。 若存在多个参数,将各个参数用逗号隔开。 参数可以具有默认值。,4. 返回类型,是可选的,即操作不一定必须有返回类型。 绝大部分编程语言只支持一个返回值。 具体的编程语言一般要加一个关键字void来表示无返回值。,5. 特性字符串,在操作的定义中加入一些除了预定义元素之外的信息。 例如

8、: query这样的特性说明该操作不会修改系统的状态。 update这样的特性说明该操作会修改系统的状态。,(4)职责 (responsibility),类图标中还可以制定另一种类的信息。在操作列表框下面的区域,可以用来说明类的职责。 职责描述了 类做什么类的属性和操作能完成什么任务。 例如,一个洗衣机的职责是将脏衣服作为输入,输出洗干净的衣服。,职责,(5)约束,指定了类所要满足的一个或多个规则。 形式化的方法。,(6)注释,注释可以包含图形也可以包含文本。,6.1.3 接口和抽象类-抽象类,抽象操作:是指在指定该操作的类中并没有该操作的实现方法,而只是显示了操作签名的那种操作。(例如, C

9、+中的纯虚函数) 抽象类:至少拥有一个抽象操作的类。 在UML图中,抽象操作的显示是在操作签名后面用特性字符串abstract,或者将操作签名用斜体字体方式显示。 在UML图中,抽象类的显示是在类名后面用特性字符串abstract,或者将类名用斜体字体方式显示。,如果一个类继承了抽象类,该类要么必须实现所有的抽象操作称为具体类,要么该类也称为另一个抽象类。 抽象类是不能产生实例的。,抽象类名用斜体,接口是一组没有相应方法实现的描述。 接口通常被描述抽象操作,即之用操作名、参数表和返回类型说明接口行为,而操作的实现部分将出现在实现该接口的元素中。 使用接口可以很好地将类所需要的行为与该行为如何被

10、实现完全分开。 在进行系统建模时,接口起来十分重要的作用,因为模型元素之间的协作是通过接口进行的。,6.1.3 接口和抽象类-接口 (interface),6.1.3 接口和抽象类-接口 (interface),uml中接口通常只包含操作不包含属性。 接口不能实例化为对象。 一个类可以实现一个或多个接口。 如果类实现了接口,但未实现该接口中的所有操作,那么此类必须声明为抽象的。,与java中接口的概念稍有不同。,接口与抽象类的区别,一般接口不含有属性,抽象类可以含有属性。 接口中声明的方法都没有实现部分,而抽象类中的某些方法可以有具体实现。 使用接口比使用抽象类安全,可以避免许多因为多继承产生

11、的问题。,6.1.4 类之间的关系,关联(association) 聚合(aggregation)和组合(composition) 泛化 (generalization) 实现(realization) 依赖 (dependenc),1.关联关系 当类之间在概念上有连接关系时,这种关系叫做关联(association)。,名称(Name) 角色(Role) 多重性(Multiplicity) 限定关联 自反关联 关联上的约束 派生关联 关联类 导航性(Navigation) 聚合关系(Aggregation) 组合关系(Composition,(1) 名称,关联名来描述关联的作用,清晰而简洁地

12、说明对象间关系。使用一个动词或动词短语来命名关联。 关联的名称并不是必需的。 可以前缀或后缀一个指引阅读方向的方向指示符,以消除歧义。,一个关联队员和球队之间的关联。可以用一个短语“队员为篮球队效力(plays on)”来刻划这个关联。,关联的导航型,单向关联:关联是单向的,从一个类的对象可以找到另一个,反过来却不可。 双向关联:关联是双向的,如果一个对象和另一个对象关联,那么这两个对象都互相知道对方。,(2) 角色,当一个类和另一个类发生关联时,每个类通常在关联中部扮演着某种角色。一个类对另一个类所表现出来的职责。 在队员和球队的关联中,如果球队是职业篮球队,那么它就是队员的雇主(Emplo

13、yer),队员就是球队的雇员(Employee)。,角色名不是类的组成部分,一个类可以在不同的关联中扮演不同的角色。 由于角色名称和关联名称都被用来描述关系的目的,所以角色名称可以代替关联名称,或者两者同时使用。 与关联名称不同,角色名可以生成代码。(使用Rose工具可以直接生成代码) 角色本身也具有可见性。(UML2.0 不在提倡使用角色本身的可见性),private class Person private String personName; protected Company employer; /* * */ public Person() ,public class Company

14、 private String companyName; public Person employee; /* * */ public Company() ,private class Password /* * */ public Password() ,public class Id public Password thePassword; /* * */ public Id() ,单向关联,(3) 多重性,关联的多重性指某个类有多少个对象可以和另一个类的单个对象关联。 表示多重性的方法是在参与关联的类附近的关联线上注名多重性数值。可以表达一个取值范围、特定值、无限定的范围或一组离散值。

15、格式:“minimummaximum” (均为Int型)。,(3) 多重性,UML使用星号(*)来代表许多(more)和多个(many)。 在一种语境中,两点代表or(或)关系,例如“1*”代表一个或者多个 在另一种语境中,or关系用逗号来表示,例如“5,10”代表5或者10。,如果没有明确标识多重性,就意味着1。,思考:多重性 3,69 表示什么?,(4)限定关联(qualified association),带有限定符的关联称为限定关联(受限关联)。 限定关联用于一对多或多对多关联这种情况。 限定符的作用就是给定关联一端的一个对象和限定符以后,可确定另一端的一个对象和对象集。,一个cust

16、omer可以在bank中有多个account,但给定了一个account值后,就可以对应一个customer,或者没有。因为多重性为01。 这里的多重性表示的是customer和(bank,account)之间的关系。,(bank,account)0,1 customer Customer-多个(bank,account),限定符指定了如何标识一对多关联或多对多关联中的多端对象集中的一个特定对象,并且可以将其看做是区分这种关联中所有对象的一种关键字。 限定关联把模型从一对多关联简化为一对一关联。 限定符是关联线的一个附加信息,而不是类的。,限定符,针对于学生端的,针对于关联,限定符这个概念在设

17、计软件时非常有用,如果一个应用系统需要根据关键字对一个数据集做查询操作,则经常会用到限定关联。 引入限定符的一个目的就是把多重性从n降到1或01,这样如果做查询操作,则返回的对象至多是一个,而不会是一个对象集。如果查询操作的结果是单个对象,则这个查询操作的效率会较高。 所以在使用限定符时,如果限定符另一端的多重性仍为n,则引入这个限定符的作用就不是很大。因为查询结果任然还是结果集,所以也可以根据多重性来判断一个限定符的设计是否合理。,(5)自反关联,一个类可能与它自己发生关联,这样的关联被称为自身关联。 当一个类的对象可以充当多种角色时,自身关联就可能发生。 CarOccupant(车上的人)

18、既可能是一个司机(driver)也可能是一个乘客(passenger)。,(6)关联上的约束,两个类之间的一个关联有一个规则约束。,有序关联,或关联,(7)派生属性和派生关联,派生属性(derived attribute)和派生关联(derived association)是指可以从其他属性和关联计算推演得到的属性和关联。 派生属性和派生关联的名字前需要加一个斜杠“/”。 在生成代码时,派生属性和派生关联都不产生相应的代码。,(8)关联类,和类一样,关联也可以有自己的属性和操作。此时,这个关联实际上是个关联类。 关联类的可视化表示方式与一般的类相同,但是要用一条虚线把关联类和对应的关联线连接起

19、来,来标识关联的一些附加信息。 关联类也可以与其他类关联。,关联类,private class Person private String personName; protected Company employer; / public class Company private String companyName; public Person employee ; / ,private class Contract private Double salary; /* * */ public Contract() ,多重性,下图是player类和Team类之间的Plays on关联对应的关联

20、类:Contract(契约)关联类。它又同时和GeneralManager(总经理)类发生关联。,关联类也可以与其他类关联,2.聚合关系,一种特殊类型的关联。 表示整体与部分关系的关联。 描述了“由构成”、 “包含”、 “是的一部分”的关系。,共享聚合,如果聚合关系中的处于部分方的对象同时参与了多个处于整体方对象的构成,则该聚合称为共享聚合。 例如:一个球队(整体方)由多个球员(部分方)组成,但是一个球员还可能参加多个球队,球队和球员的这种关系就是共享聚合。 共享聚合关系可以通过聚合的多重性反应出来。如果作为整体方的类的多重性不是1,该聚合就是共享聚合。,可以在聚合关系 上建立约束,2. 组合

21、关系,聚合关系中的一种特殊情况,是更强形式的聚合,又称强聚合。 成员对象的生命周期取决于聚合的生命周期。 部分类完全隶属于整体类。 聚合不仅控制着成员对象的行为,而且控制着成员对象的创建和解构。,聚合和组合的两端也可以添加角色和多重性。,组合的实现方式一般是将部分类中的对象作为整体类的成员对象,将部分类封装在整体类中。,聚合和组合的区别,聚合关系表示事物的整体/部分关系的较弱的情况,组合关系表示事物的整体/部分关系的较强的情况。 在聚集关系中,代表部分事物的对象可以属于多个聚集对象,可以为多个聚集对象所共享,而且可以随时改变它所从属的聚集对象。代表部分事物的对象与代表聚集事物的对象的生存期无关

22、,一旦删除了聚集对象,不一定也随即删除代表部分事物的对象。 在组合关系中,代表整体事物的对象负责创建和删除代表部分事物的对象,代表部分事物的对象只属于一个组合对象。一旦删除了组合对象,也就随即删除了相应的代表部分事物的对象。,3.泛化关系,存在于一般元素和特殊元素间的分类关系。 可以用于类、用例以及其他模型元素。 描述了一种“is a kind of” 的关系。,类的泛化关系可以是多层的。,ROSE中,只有父类的共有(public)和保护(protect)成员会被子类继承。,泛化的好处,把一般的公共信息放在一般元素中,处理某个具体特殊情况时只需定义该情况的个别信息,公共信息从一般元素中继承得到

23、,增强了系统的灵活性、易维护性和可扩充性。(继承性) 程序员只要定义新扩充或更改的信息就可以了,旧的信息完全不必修改(仍可以继续使用),大大缩短了维护系统的时间。 可实现多态。一般元素出现的地方都可以用特殊元素来代替。(子类代替父类) 多态技术利用抽象类定义操作,而用子类实现该操作的方法,达到单一接口,多种功能的目的。,人“驾驶”交通工具这个关联关系。当人执行(调用)drive( )操作时,如果当时可用的对象是汽车,那么汽车轮子将被转动;如果当时可用的对象是船,那么螺旋桨就会动起来,这种就是在运行时可能执行的多种情况,称为“多态”。 C+中,多态利用虚函数或纯虚函数实现。(使用指向基类的指针进

24、行函数调用),替换原则:父类出现的任何地方都可以用子类代替。,泛化关系上的约束-受限泛化,UML预定义的泛化约束有:多重,不相交,完全,不完全,受限泛化的表示形式:,1.多重继承:子类的子类可以同时继承多个上一级子类。 例如:水陆两用继承了交通工具两次。 2.不相交继承:与多重继承对立,一个子类不能同时继承多个上一级子类。如果不做特别声明,一般的继承都是不相交继承(默认的继承标准)。上例如果没有多重约束,则不允许水陆两用类多重继承,只允许继承其中之一。,分辨器:把一般类和具体类划分开的依据。,3.完全继承指父类的所有子类都被穷举完毕,不可能再有其它的未列出的子类存在。 4.非完全继承与完全继承

25、相反,父类的子类并不是都列出来了,而是随着问题的不断解决,不断的补充和完善,也正是这一点为日后系统的扩充和维护带来极大的方便。(是默认的继承标准)。,4.实现关系,一个元素完成另一个元素的操作功能。(实现是规格说明和其实现之间的关系。) 如接口类及其实现:接口没有属性,只有声明的操作方法(对方法没有实现部分),而由其实现类具体定义实现部分。 如用例以及实现该用例的协作之间也是实现关系。,泛化关系和实现关系的异同点,泛化和实现关系都可以将一般描述与具体描述联系起来。 泛化将同一语义层上的元素连接起来,并且通常在同一个模型内。 实现关系则将不同语义层内的元素连接起来,通常建立在不同模型内。在不同发

26、展阶段可能有两个或多个类等级存在,这些类等级的元素通过实现关系联系在一起。,5.依赖关系,关联、实现和泛化都是依赖关系。但它们有更特别的语义, 所以在UML中被分离出来作为独立的关系。,基本的依赖关系,在依赖关系上可以用构造型来更具体化依赖的种类。 1. 使用依赖(Usage) 2. 抽象依赖(Abstraction) 3. 授权依赖(Permission) 4. 绑定依赖(Binding),1. 使用依赖 -最常使用的依赖,表示一种元素(客户)使用其它元素(提供者)提供的服务以实现它的行为,包括: 使用(use) 调用(call) 参数(parameter) 发送(send) 实例化(ins

27、tantiate),使用use:声明使用一个模型元素需要用到已存在的另一个模型元素,这样才能实现使用者的功能(包括调用、实例化、参数、发送)。 调用call:声明一个类调用其他类的操作的方法。 参数parameter:声明一个操作和它的参数之间的关系。 发送send:声明信号发送者和信号接受者之间的关系。(例如遥控器和电视机) 实例化instantiate:声明一个类的方法创建了另一个类的实例。,注意: 与关联关系不一样的是,依赖关系本身不生成专门的实现代码。,2. 抽象依赖,表示客户与提供者之间的关系,依赖于在不同抽象层次上的事物,包括: 跟踪(trace) 精化(refine) 派生(de

28、rive),跟踪trace:表示两个元素代表的是不同模型中的同一个概念。通常这些模型分属于开发过程中不同阶段。 精化refine:表示位于不同的开发阶段或处于不同的抽象层次中的一个概念的两种形式之间的映射关系。并不意味这两种形式会在最后的模型中共存,它们中一个通常是另一个的未完善形式。设计类将refine在分析过程中描述的类。 派生derive:声明一个实例可以从另一个实例导出。可以根据提供方的信息计算出客户方。,3. 授权依赖,表达一个事物访问另一个事物的能力,被依赖元素通过规定依赖元素的权限,可以控制和限制对其进行访问的方法。包括: 访问(access) 导入(import) 友元(fri

29、end),访问access:允许一个包访问另一个包的内容。(必须使用路径名称访问) 导入import:允许一个包访问另一个包的内容,并为被访问的包的组成部分增加别名。 友元friend:允许一个元素访问另一个元素,不管被访问的元素是否具有可见性。,4. 绑定依赖,较高级的依赖类型,用于绑定模板以创建新的模型元素,包括: 绑定(bind) 例如:C+中的函数模板、类模板 与具体函数和具体类之间的关系。,类模板(带参数的类parameterized class),UML中,类矩形框右上角挂着一个小的虚线框,框中是为了生成具体类所需要指值的参数列表。当为这些参数指定值时,就说这些参数被绑定到这些值上

30、。 右上角虚线框中的“T”是一个分类,它说明这个类是创建其他类的模板。,C+提供模板机制,java中没有与此等价的语法结构 类模板C+代码,#include using namespace std; template /声明一个模板,虚拟类型名为T class Compare /类模板名为Compare public: Compare(T a, T b) /构造函数 x=a;y=b; T max( ) return (xy)?x:y; T min( ) return (xy)?x:y; private: T x,y; ;,int main( ) Compare cmp1(3,7); /定义对象

31、cmp1,用于两个整数的比较 cout cmp2(45.78,93.6); /定义对象cmp2,用于两个浮点数的比较 cout cmp3(a,A); /定义对象cmp3,用于两个字符的比较 coutcmp3.max( )“ is the Maximum of two characters.”endl; coutcmp3.min( )“ is the Minimum of two characters.”endl; return 0; ,运行结果 7 is the Maximum of two integers. 3 is the Minimum of two integers. 93.6 is

32、 the Maximum of two float numbers. 45.78 is the Minimum of two float numbers. a is the Maximum of two characters. A is the Minimum of two characters.,两种表示参数化类的方法 1. 显式绑定(explicit binding):明确显示出生成的类和参数化类之间的依赖关系,并提供生成类的名字。,2. 隐式绑定(implicit binding):不显示出依赖关系,绑定参数出现在产生的类名后面,并用尖括号括起来。,6.2 类图的绘制,类图的抽象层次,在

33、软件开发的不同阶段,使用的类图具有不同的抽象层次。,类图的3个层次之间没有一个很清晰的界限,类图从概念层到实现层的过度是一个渐进的过程。,6.3 对象图,对象和类的关系,链,对象是类的实例,链是类图中关联的实例。 链连接的是对象,可以有链名,和对象名一样都要加下划线。,注意: 链可以有名称、角色、但没有多重性,所有的链都是一对一的关系。,对象图,对象是类的实例,对象图也可看作是类图的实例。 对象图描述了参与交互的各个对象在交互过程中某一时刻的状态。可以认为对象图是类图在某一时刻的实例。,类,对象:只有两栏,类图和对象图,类图和对象图的区别,6.4 用例分析分析类,UML主要有3种主要的类版型

34、: entity boundarycontrol 引入边界类、控制类、实体类的概念有助于分析和设计人员确定系统中的类。,每个actor/user case对至少要有一个边界类,但并非每个actor/user case对都要生成唯一的边界类。例如:多个actor启动一个用例时,可以用一个边界类与系统通信。,边界类的分类,用户接口类 帮助与用户进行通信的类,通过标准的I/O设备提供人机界面 系统接口类 帮助与其他系统进行通信的类,系统接口对象隐藏如何与外部接口通信的细节 设备接口类或Timer 提供对硬件设备的软件接口,实体类,实体类是持久的,是永久保存的信息。就是保存到数据库或文件中。实体对象可

35、以出现在多个用例中。 实体类可以通过事件流和交互图发现。 通常,每个实体类在数据库中有相应的表,实体类中的属性对应数据库中表的字段。 但这并不意味着,实体类和数据库中的表是一一对应的。有可能是一个实体类对应多个表,也可能是多个实体类对应一个表。(与数据库设计模式有关)。 有时Actor也可作为实体类。,控制类,控制类是负责其他工作的类。它负责协调其他类工作和控制总体逻辑流程。 一般每个用例都有一个控制类,控制用例中的事件顺序,控制类也可以在多个用例间共用。 控制类通常被看成一个乐队的指挥,它指挥(控制)参与use case的其它对象的行为,通知对象什么时候执行以及执行什么。 其他类并不向控制类发送很多消息,而是控制类发出很多消息。,关联可以是双向的,单向的,自关联的,作业1:根据UML类图理解其表示含义,作业2:根据UML类图理解其表示含义,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1