
第6章类图和对象图郭.ppt
130页第第6章章 类图和对象图类图和对象图l6.1 类图的概念类图的概念l6.2 类图建模技术类图建模技术l6.3 对象图对象图l6.4 补充:分析类补充:分析类类图类图l类图类图描述系统中类的静态结构,描述系统中的描述系统中类的静态结构,描述系统中的类类及及类之间的关系类之间的关系,还描述类的,还描述类的内部结构内部结构(类(类的属性和操作)的属性和操作)l类图类图描述的是一种描述的是一种静态关系静态关系,在系统的整个生,在系统的整个生命期中都是有效的命期中都是有效的l对象图对象图是类图的实例,由于对象存在生命周期,是类图的实例,由于对象存在生命周期,所以对象图只能在系统的某一时间存在所以对象图只能在系统的某一时间存在类图的地位类图的地位l类图类图是面象对象系统建模中最常用的图是面象对象系统建模中最常用的图l类图类图是定义其它图的基础,在类图的基础上,是定义其它图的基础,在类图的基础上,可以使用状态图、协作图、组件图和配置图等可以使用状态图、协作图、组件图和配置图等进一步描述系统其它方面的特征进一步描述系统其它方面的特征l类图中的类类图中的类可以直接用某种面向对象编程语言可以直接用某种面向对象编程语言实现。
实现6.1 类图的概念类图的概念l描述类、接口及它们之间关系的图描述类、接口及它们之间关系的图l显示系统中各个类的静态结构显示系统中各个类的静态结构 6.1.1 概述概述l类图的元素:类图的元素:①①类(类(Class))②②接口(接口(Interface))③③依赖关系(依赖关系(Dependency))④④泛化关系(泛化关系(Generalization))⑤⑤关联关系(关联关系(Association))⑥⑥实现关系(实现关系(Realization)) 6.1.2 类类 l类类是构成类图的基础,也是面向对象系统组织结是构成类图的基础,也是面向对象系统组织结构的核心构的核心 l类类是对一组具有相同属性、操作、关系和语义的对象是对一组具有相同属性、操作、关系和语义的对象的抽象l类类包括包括名称部分(名称部分(Name))、、属性部分(属性部分(Attribute))和和操作部分(操作部分(Operation)) lUML规范采用一个具有规范采用一个具有3个分栏的图标表示一个类个分栏的图标表示一个类•名称分栏必须出现,而属性分栏和操作分栏可名称分栏必须出现,而属性分栏和操作分栏可以出现或不出现。
以出现或不出现•当隐藏某个分栏时,并非表明某个分栏不存在当隐藏某个分栏时,并非表明某个分栏不存在隐藏操作参数隐藏操作参数隐隐藏藏可可见见性性6.1.2 类类l1 名称名称l2 属性属性l3 操作操作l4 职责职责l5 约束约束l6 注释注释((1)名称)名称 l应该来自系统的问题域应该来自系统的问题域 l应该是一个名词应该是一个名词 l分为简单名称和路径名称分为简单名称和路径名称 ((2)属性)属性l描述了类在软件系统中代表的事物(即对象)所具备描述了类在软件系统中代表的事物(即对象)所具备的特性 l类可以有任意数目的属性,也可以没有属性类可以有任意数目的属性,也可以没有属性 l在在UML中,类属性的语法为:中,类属性的语法为:1. 可见性可见性l可见性描述了该属性对其它类是否可见,以可见性描述了该属性对其它类是否可见,以及是否可以被其它类引用及是否可以被其它类引用l类型:类型:①①公有(公有(Public)) “++”②②私有(私有(Private))“--”③③受保护(受保护(Protected))“##” 注意:注意:UML未规定默认未规定默认的可见性,如果没的可见性,如果没有给出,表明该属有给出,表明该属性的可见性尚未定性的可见性尚未定义。
义2. 属性名属性名 l每个属性都必须有一个名字以区别于类中的其他每个属性都必须有一个名字以区别于类中的其他属性 l属性名由描述所属类的特性的名词或名词短语组属性名由描述所属类的特性的名词或名词短语组成 l单字属性名小写,如果属性名包含了多个单词,单字属性名小写,如果属性名包含了多个单词,这些单词要合并,且除了第一个单词外其余单词这些单词要合并,且除了第一个单词外其余单词的首字母要大写的首字母要大写 ----建议建议3. 类型类型 l简单类型:简单类型:①①整型整型②②布尔型布尔型③③实型实型④④枚举类型枚举类型l系统中的其他类系统中的其他类 4. 初始值初始值 l目的目的:①①保护系统的完整性,防止漏掉取值或被非法保护系统的完整性,防止漏掉取值或被非法的值破坏系统的完整性的值破坏系统的完整性②②为用户提供易用性为用户提供易用性 5. 属性字符串属性字符串 l属性字符串是用户对该属性性质的一个约束说明属性字符串是用户对该属性性质的一个约束说明l例如例如 {只读只读}这样的特性说明该属性的值不能被修改这样的特性说明该属性的值不能被修改l任何希望添加在属性定义字符串值但又没有合适地任何希望添加在属性定义字符串值但又没有合适地方可以加入的规则,都可以放在属性字符串里。
方可以加入的规则,都可以放在属性字符串里 +status:Status=unpaid{unpaid,paid} +color:Color=red{red,green,yellow}确定取值范围确定取值范围补充:补充:作用域作用域l作用域(作用域(scope))是与属性和操作相关的一是与属性和操作相关的一个重要概念个重要概念l存在两种作用域:存在两种作用域:1.实例(实例(instance)作用域)作用域下,类的每个实例下,类的每个实例对象都有自己的属性值和操作对象都有自己的属性值和操作2.分类符(分类符(classifier)作用域)作用域下,一个类的所下,一个类的所有实例只存在一个属性值和操作分类作用有实例只存在一个属性值和操作分类作用域的属性和操作名字要带下划线域的属性和操作名字要带下划线类的作用域属性:类的作用域属性:l分类作用域的属性,它能被所属类的所有分类作用域的属性,它能被所属类的所有对象共享对象共享例如:例如:C++中中的静态的静态成员成员静态属性静态属性属性声明的例子属性声明的例子Points属性的多重性属性的多重性为为2..*,表示该属性,表示该属性值有值有2个或者多个,个或者多个,同时这些值之间是有同时这些值之间是有序的。
序的Name属性的多重性为属性的多重性为0..2,表示,表示该属性值有可能是该属性值有可能是1个或者个或者2个,也个,也可能值为可能值为null((3)操作)操作l对类的对象所能做的事务的抽象对类的对象所能做的事务的抽象l一个类可以有任意数量的操作或者根本没有操一个类可以有任意数量的操作或者根本没有操作 l返回类型、名称和参数一起被称为操作签名返回类型、名称和参数一起被称为操作签名 l在在UML中,类操作的语法为:中,类操作的语法为:操作操作l1. 可见性可见性l2. 操作名操作名l3. 参数表参数表l4. 返回类型返回类型l5. 特性字符串特性字符串1. 可见性可见性l类型:类型:①①公有(公有(Public)) “++”②②私有(私有(Private)) “--”③③受保护(受保护(Protected)) “##”④④包内公有(包内公有(Package)) “~~”包内公有(包内公有(Package))“~~”包内公有用来描述操作的可访问性的包内公有用来描述操作的可访问性的可见性为包内公有的操作可以被其所在包的对象访问可见性为包内公有的操作可以被其所在包的对象访问。
2. 操作名操作名 l用来描述所属类的行为的动词或动词短语用来描述所属类的行为的动词或动词短语l单字操作名小写,如果操作名包含了多个单词,单字操作名小写,如果操作名包含了多个单词,这些单词要合并,并且除了第一个单词外其余这些单词要合并,并且除了第一个单词外其余单词的首字母要大写单词的首字母要大写 3. 参数表参数表 l一些按顺序排列的属性定义了操作的输入一些按顺序排列的属性定义了操作的输入 l是可选的,即操作不一定必须有参数才行是可选的,即操作不一定必须有参数才行 l定义方式:定义方式:“名称:类型名称:类型”l若存在多个参数,将各个参数用逗号隔开若存在多个参数,将各个参数用逗号隔开l参数可以具有默认值参数可以具有默认值 4. 返回类型返回类型l是可选的,即操作不一定必须有返回类型是可选的,即操作不一定必须有返回类型 l绝大部分编程语言只支持一个返回值绝大部分编程语言只支持一个返回值 l具体的编程语言一般要加一个关键字具体的编程语言一般要加一个关键字void来表来表示无返回值示无返回值 5. 特性字符串特性字符串 l在操作的定义中加入一些除了预定义元素之外在操作的定义中加入一些除了预定义元素之外的信息的信息。
l例如:例如: {query}这样的特性说明该操作不会修改系统的这样的特性说明该操作不会修改系统的状态 {update}这样的特性说明该操作会修改系统的这样的特性说明该操作会修改系统的状态((4)职责)职责 ((responsibility))l类图标中还可以制定另一类图标中还可以制定另一种类的信息在操作列表种类的信息在操作列表框下面的区域,可以用来框下面的区域,可以用来说明类的职责说明类的职责l职责描述了职责描述了 类做什么--类做什么--类的属性和操作能完成什类的属性和操作能完成什么任务l例如,一个洗衣机的职责例如,一个洗衣机的职责是将脏衣服作为输入,输是将脏衣服作为输入,输出洗干净的衣服出洗干净的衣服职责职责((5)约束)约束l指定了类所要满足的一个或多个规则指定了类所要满足的一个或多个规则 l形式化的方法形式化的方法 ((6)注释)注释l注释可以包含图形也可以包含文本注释可以包含图形也可以包含文本 6.1.3 接口和抽象类接口和抽象类---抽象类抽象类l 抽象操作:抽象操作:是指在指定该操作的类中并没有该操作的是指在指定该操作的类中并没有该操作的实现方法,而只是显示了操作签名的那种操作实现方法,而只是显示了操作签名的那种操作。
例例如,如, C++中的纯虚函数)中的纯虚函数)l抽象类抽象类:至少拥有一个抽象操作的类:至少拥有一个抽象操作的类l在在UML图中,抽象操作的显示是在操作签名后面用特图中,抽象操作的显示是在操作签名后面用特性字符串性字符串{abstract},或者将操作签名用斜体字体方,或者将操作签名用斜体字体方式显示l在在UML图中,抽象类的显示是在类名后面用特性字符图中,抽象类的显示是在类名后面用特性字符串串{abstract},或者将类名用斜体字体方式显示或者将类名用斜体字体方式显示1.如果一个类继如果一个类继承了抽象类,承了抽象类,该类要么必须该类要么必须实现所有的抽实现所有的抽象操作称为具象操作称为具体类,要么该体类,要么该类也称为另一类也称为另一个抽象类个抽象类2.抽象类是不能抽象类是不能产生实例的产生实例的抽象类名抽象类名用斜体用斜体l接口是一组没有相应方法实现的描述接口是一组没有相应方法实现的描述l接口通常被描述抽象操作,即之用操作名、参数接口通常被描述抽象操作,即之用操作名、参数表和返回类型说明接口行为,而操作的实现部分表和返回类型说明接口行为,而操作的实现部分将出现在实现该接口的元素中。
将出现在实现该接口的元素中l使用接口可以很好地将类所需要的行为与该行为使用接口可以很好地将类所需要的行为与该行为如何被实现完全分开如何被实现完全分开l在进行系统建模时,接口起来十分重要的作用,在进行系统建模时,接口起来十分重要的作用,因为模型元素之间的协作是通过接口进行的因为模型元素之间的协作是通过接口进行的 6.1.3 接口和抽象类接口和抽象类---接口接口 ((interface)) 6.1.3 接口和抽象类接口和抽象类---接口接口 ((interface))luml中接口通常只包含操作不包含属性中接口通常只包含操作不包含属性l接口不能实例化为对象接口不能实例化为对象l一个类可以实现一个或多个接口一个类可以实现一个或多个接口l如果类实现了接口,但未实现该接口中的所有操如果类实现了接口,但未实现该接口中的所有操作,那么此类必须声明为抽象的作,那么此类必须声明为抽象的与与java中接口中接口的概念稍有不的概念稍有不同接口与抽象类的区别接口与抽象类的区别l一般接口不含有属性,抽象类可以含有属性一般接口不含有属性,抽象类可以含有属性l接口中声明的方法都没有实现部分,而抽象类中接口中声明的方法都没有实现部分,而抽象类中的某些方法可以有具体实现。
的某些方法可以有具体实现l使用接口比使用抽象类安全,可以避免许多因为使用接口比使用抽象类安全,可以避免许多因为多继承产生的问题多继承产生的问题6.1.4 类之间的关系类之间的关系 1.关联(关联(association))2.聚合(聚合(aggregation)和组合()和组合(composition))3.泛化泛化 ((generalization))4.实现(实现(realization))5.依赖依赖 ((dependenc))1.关联关系关联关系当类之间在概念上有连接关系时,这种关系叫做当类之间在概念上有连接关系时,这种关系叫做关联关联(association)l名称(名称(Name))l角色(角色(Role))l多重性(多重性(Multiplicity))l限定关联限定关联l自反关联自反关联l关联上的约束关联上的约束l派生关联派生关联l关联类关联类l导航性(导航性(Navigation))l聚合关系(聚合关系(Aggregation))l组合关系(组合关系(Composition((1)) 名称名称l关联名来描述关联的作用,清晰而简洁地说明对象关联名来描述关联的作用,清晰而简洁地说明对象间关系。
使用一个动词或动词短语来命名关联使用一个动词或动词短语来命名关联l关联的名称并不是必需的关联的名称并不是必需的 l可以前缀或后缀一个指引阅读方向的可以前缀或后缀一个指引阅读方向的方向指示符方向指示符,,以消除歧义以消除歧义 一个关联一个关联——队员和球队之间的关联可以用一个队员和球队之间的关联可以用一个短语短语“队员为篮球队效力队员为篮球队效力(plays on)”来刻划这个来刻划这个关联关联的导航型关联的导航型l单向关联单向关联:关联是单向的,从一个类的对象:关联是单向的,从一个类的对象可以找到另一个,反过来却不可可以找到另一个,反过来却不可l双向关联双向关联:关联是双向的,如果一个对象和:关联是双向的,如果一个对象和另一个对象关联,那么这两个对象都互相知道另一个对象关联,那么这两个对象都互相知道对方((2)) 角色角色 •当一个类和另一个类发生关联时,每个类通常当一个类和另一个类发生关联时,每个类通常在关联中部扮演着某种角色一个类对另一个在关联中部扮演着某种角色一个类对另一个类所表现出来的职责类所表现出来的职责l在队员和球队的关联中,如果球队是职业篮球在队员和球队的关联中,如果球队是职业篮球队,那么它就是队员的雇主队,那么它就是队员的雇主(Employer),,队员队员就是球队的雇员就是球队的雇员(Employee)。
l角色名不是类的组成部分,一个类可以在不同角色名不是类的组成部分,一个类可以在不同的关联中扮演不同的角色的关联中扮演不同的角色l由于角色名称和关联名称都被用来描述关系的由于角色名称和关联名称都被用来描述关系的目的,所以角色名称可以代替关联名称,或者目的,所以角色名称可以代替关联名称,或者两者同时使用两者同时使用l与关联名称不同,角色名可以生成代码使与关联名称不同,角色名可以生成代码使用用Rose工具可以直接生成代码)工具可以直接生成代码)l角色本身也具有可见性角色本身也具有可见性UML2.0 不在提倡不在提倡使用角色本身的可见性)使用角色本身的可见性)private class Person { private String personName; protected Company employer; /** * */ public Person() { }}public class Company { private String companyName; public Person employee; /** * */ public Company() { }}private class Password { /** * */ public Password() { }}public class Id { public Password thePassword; /** * */ public Id() { }}单向关联单向关联((3)) 多重性多重性l关联的多重性指某个类有多少个对象可以和另一关联的多重性指某个类有多少个对象可以和另一个类的单个对象关联。
个类的单个对象关联l表示多重性的方法是在参与关联的类附近的关联表示多重性的方法是在参与关联的类附近的关联线上注名多重性数值可以表达一个取值范围、线上注名多重性数值可以表达一个取值范围、特定值、无限定的范围或一组离散值特定值、无限定的范围或一组离散值 l格式:格式:“minimum..maximum” (均为(均为Int型)((3)) 多重性多重性nUML使用星号使用星号(*)来代表许多来代表许多(more)和多个和多个(many)n在一种语境中,两点代表在一种语境中,两点代表or(或或)关系,例如关系,例如“1..*”代表一个或者多个代表一个或者多个n在另一种语境中,在另一种语境中,or关系用逗号来表示,例如关系用逗号来表示,例如“5,,10”代表代表5或者或者10l如果没有明确标识多重性,就意味着如果没有明确标识多重性,就意味着1思考思考:多重性:多重性 3,,6..9 表示什么?表示什么?((4)限定关联()限定关联(qualified association))l带有限定符的关联称为带有限定符的关联称为限定关联限定关联(受限关联受限关联)l限定关联用于限定关联用于一对多或多对多关一对多或多对多关联联这种情况。
这种情况l限定符的作用就是给定关联一端限定符的作用就是给定关联一端的一个对象和限定符以后,可确的一个对象和限定符以后,可确定另一端的一个对象和对象集定另一端的一个对象和对象集l一个一个customer可以在可以在bank中有多个中有多个account,但给定,但给定了一个了一个account值后,就可值后,就可以对应一个以对应一个customer,或,或者没有因为多重性为者没有因为多重性为0..1l这里的多重性表示的是这里的多重性表示的是customer和(和(bank,,account)之间的关系之间的关系bank,,account)-)->0,1 customerCustomer->多个(多个(bank,,account))l限定符指定了如何标识一对多关联或多对多关联中限定符指定了如何标识一对多关联或多对多关联中的的多端对象集中的一个特定对象多端对象集中的一个特定对象,并且可以将其看,并且可以将其看做是区分这种关联中所有对象的一种做是区分这种关联中所有对象的一种关键字关键字l限定关联把模型从一对多关联简化为一对一关联限定关联把模型从一对多关联简化为一对一关联l限定符是关联线的一个附加信息,而不是类的。
限定符是关联线的一个附加信息,而不是类的限定符限定符针对于学生端的针对于学生端的针对于关联针对于关联l限定符这个概念在设计软件时非常有用,如果一限定符这个概念在设计软件时非常有用,如果一个应用系统需要根据关键字对一个数据集做查询个应用系统需要根据关键字对一个数据集做查询操作,则经常会用到限定关联操作,则经常会用到限定关联l引入限定符的一个目的就是把多重性从引入限定符的一个目的就是把多重性从n降到降到1或或0..1,这样如果做查询操作,则返回的对象至多是,这样如果做查询操作,则返回的对象至多是一个,而不会是一个对象集如果查询操作的结一个,而不会是一个对象集如果查询操作的结果是单个对象,则这个查询操作的效率会较高果是单个对象,则这个查询操作的效率会较高l所以在使用限定符时,如果限定符另一端的多重所以在使用限定符时,如果限定符另一端的多重性仍为性仍为n,则引入这个限定符的作用就不是很大则引入这个限定符的作用就不是很大因为查询结果任然还是结果集,所以也可以根据因为查询结果任然还是结果集,所以也可以根据多重性来判断一个限定符的设计是否合理多重性来判断一个限定符的设计是否合理((5)自反关联)自反关联l一个类可能与它自己发生关一个类可能与它自己发生关联,这样的关联被称为自身联,这样的关联被称为自身关联。
关联l当一个类的对象可以充当多当一个类的对象可以充当多种角色时,自身关联就可能种角色时,自身关联就可能发生lCarOccupant(车上的人车上的人)既可能是一个司机既可能是一个司机(driver)也可能是一个乘客也可能是一个乘客(passenger)((6)关联上的约束)关联上的约束l两个类之间的一个关联有一个规则约束两个类之间的一个关联有一个规则约束有序关联有序关联或关联或关联(7)派生属性和派生关联派生属性和派生关联l派生属性(派生属性(derived attribute)和派生关联)和派生关联((derived association)是指可以从其他属性和)是指可以从其他属性和关联计算推演得到的属性和关联关联计算推演得到的属性和关联l派生属性和派生关联的名字前需要加一个斜杠派生属性和派生关联的名字前需要加一个斜杠“/”l在生成代码时,派生属性和派生关联都不产生相在生成代码时,派生属性和派生关联都不产生相应的代码应的代码((8)关联类)关联类l和类一样,关联也可以有自己的属性和操作此和类一样,关联也可以有自己的属性和操作此时,这个关联实际上是个关联类时,这个关联实际上是个关联类。
l关联类的可视化表示方式与一般的类相同,但是关联类的可视化表示方式与一般的类相同,但是要用一条虚线把关联类和对应的关联线连接起来,要用一条虚线把关联类和对应的关联线连接起来,来标识关联的一些附加信息来标识关联的一些附加信息l关联类也可以与其他类关联关联类也可以与其他类关联关联类关联类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关关联对应的关联类:联对应的关联类:Contract(契约契约)关联类。
关联类它又同时和它又同时和GeneralManager(总经理总经理)类发类发生关联关联类也可以关联类也可以与其他类关联与其他类关联2.聚合关系聚合关系 l一种特殊类型的关联一种特殊类型的关联 l表示整体与部分关系表示整体与部分关系的关联 l描述了描述了“由由…构成构成”、、 “包含包含”、、 “是是…的的一部分一部分”的关系 共享聚合共享聚合l如果聚合关系中的处于部分方的对象同时参与了多个如果聚合关系中的处于部分方的对象同时参与了多个处于整体方对象的构成,则该聚合称为共享聚合处于整体方对象的构成,则该聚合称为共享聚合l例如:一个球队(整体方)由多个球员(部分方)组例如:一个球队(整体方)由多个球员(部分方)组成,但是一个球员还可能参加多个球队,球队和球员成,但是一个球员还可能参加多个球队,球队和球员的这种关系就是共享聚合的这种关系就是共享聚合l共享聚合关系可以通过聚合的多重性反应出来如果共享聚合关系可以通过聚合的多重性反应出来如果作为整体方的类的多重性不是作为整体方的类的多重性不是1,该聚合就是共享聚合该聚合就是共享聚合可以在可以在聚合关系聚合关系 上建立约束上建立约束2. 组合关系组合关系l聚合关系中的一种特殊情况,是更强形式的聚合关系中的一种特殊情况,是更强形式的聚合,又称强聚合。
聚合,又称强聚合l成员对象的生命周期取决于聚合的生命周期成员对象的生命周期取决于聚合的生命周期 l部分类完全隶属于整体类部分类完全隶属于整体类l聚合不仅控制着成员对象的行为,而且控制聚合不仅控制着成员对象的行为,而且控制着成员对象的创建和解构着成员对象的创建和解构 聚合和组合的两端也可以添加角色和多重性聚合和组合的两端也可以添加角色和多重性组合的实现方组合的实现方式一般是将部式一般是将部分类中的对象分类中的对象作为整体类的作为整体类的成员对象,将成员对象,将部分类封装在部分类封装在整体类中整体类中聚合和组合的区别聚合和组合的区别l聚合关系表示事物的整体聚合关系表示事物的整体/部分关系的较弱的情况,组合部分关系的较弱的情况,组合关系表示事物的整体关系表示事物的整体/部分关系的较强的情况部分关系的较强的情况l在聚集关系中,代表部分事物的对象可以属于多个聚集在聚集关系中,代表部分事物的对象可以属于多个聚集对象,可以为多个聚集对象所共享,而且可以随时改变对象,可以为多个聚集对象所共享,而且可以随时改变它所从属的聚集对象代表部分事物的对象与代表聚集它所从属的聚集对象代表部分事物的对象与代表聚集事物的对象的生存期无关,一旦删除了聚集对象,不一事物的对象的生存期无关,一旦删除了聚集对象,不一定也随即删除代表部分事物的对象。
定也随即删除代表部分事物的对象l在组合关系中,代表整体事物的对象负责创建和删除代在组合关系中,代表整体事物的对象负责创建和删除代表部分事物的对象,代表部分事物的对象只属于一个组表部分事物的对象,代表部分事物的对象只属于一个组合对象一旦删除了组合对象,也就随即删除了相应的合对象一旦删除了组合对象,也就随即删除了相应的代表部分事物的对象代表部分事物的对象3.泛化关系泛化关系l存在于存在于一般元素和特殊元素一般元素和特殊元素间的分类关系间的分类关系 l可以用于类、用例以及其他模型元素可以用于类、用例以及其他模型元素 l描述了一种描述了一种“is a kind of” 的关系l类的泛化关系可以是多层的类的泛化关系可以是多层的ROSE中,中,只有父类只有父类的共有的共有(public)和保护和保护(protect)成员会被成员会被子类继承子类继承泛化的好处泛化的好处l把一般的公共信息放在一般元素中,处理某个具体特把一般的公共信息放在一般元素中,处理某个具体特殊情况时只需定义该情况的个别信息,公共信息从一殊情况时只需定义该情况的个别信息,公共信息从一般元素中继承得到,增强了系统的灵活性、易维护性般元素中继承得到,增强了系统的灵活性、易维护性和可扩充性。
继承性)和可扩充性继承性)l程序员只要定义新扩充或更改的信息就可以了,旧的程序员只要定义新扩充或更改的信息就可以了,旧的信息完全不必修改(仍可以继续使用),大大缩短了信息完全不必修改(仍可以继续使用),大大缩短了维护系统的时间维护系统的时间l可实现多态一般元素出现的地方都可以用特殊元素可实现多态一般元素出现的地方都可以用特殊元素来代替子类代替父类)来代替子类代替父类)l多态技术利用抽象类定义操作,而用子类实现该操作多态技术利用抽象类定义操作,而用子类实现该操作的方法,达到单一接口,多种功能的目的的方法,达到单一接口,多种功能的目的l人人“驾驶驾驶”交通工具这个交通工具这个关联关系当人执行(调关联关系当人执行(调用)用)drive( )操作时,如操作时,如果当时可用的对象是汽车,果当时可用的对象是汽车,那么汽车轮子将被转动;那么汽车轮子将被转动;如果当时可用的对象是船,如果当时可用的对象是船,那么螺旋桨就会动起来,那么螺旋桨就会动起来,这种就是在运行时可能执这种就是在运行时可能执行的多种情况,称为行的多种情况,称为“多多态态”lC++中,多态利用虚函数中,多态利用虚函数或纯虚函数实现使用或纯虚函数实现。
使用指向基类的指针进行函数指向基类的指针进行函数调用)调用)l替换原则:父类出现的任何地方都可以用子类代替替换原则:父类出现的任何地方都可以用子类代替泛化关系上的约束泛化关系上的约束---受限泛化受限泛化UML预定义的泛化约束有:多重,不相交,完全,不完全预定义的泛化约束有:多重,不相交,完全,不完全受限泛化的表示形式:受限泛化的表示形式:l1.多重继承多重继承:子类的子类可以同时继承多个上一级子类子类的子类可以同时继承多个上一级子类l例如:水陆两用继承了交通工具两次例如:水陆两用继承了交通工具两次l2.不相交继承:不相交继承:与多重继承对立,一个子类不能同时继承多个上一级与多重继承对立,一个子类不能同时继承多个上一级子类如果不做特别声明,一般的继承都是不相交继承(默认的继承子类如果不做特别声明,一般的继承都是不相交继承(默认的继承标准)上例如果没有多重约束,则不允许水陆两用类多重继承,只标准)上例如果没有多重约束,则不允许水陆两用类多重继承,只允许继承其中之一允许继承其中之一分辨器:把一般类和具体类划分分辨器:把一般类和具体类划分开的依据开的依据l3.完全继承完全继承指父类的所有子类都被穷举完毕,不可能再指父类的所有子类都被穷举完毕,不可能再有其它的未列出的子类存在。
有其它的未列出的子类存在l4.非完全继承非完全继承与完全继承相反,父类的子类并不是都列与完全继承相反,父类的子类并不是都列出来了,而是随着问题的不断解决,不断的补充和完善,出来了,而是随着问题的不断解决,不断的补充和完善,也正是这一点为日后系统的扩充和维护带来极大的方便也正是这一点为日后系统的扩充和维护带来极大的方便是默认的继承标准)是默认的继承标准)4.实现关系实现关系l一个元素完成另一个元素的操作功能实现是规一个元素完成另一个元素的操作功能实现是规格说明和其实现之间的关系格说明和其实现之间的关系l如接口类及其实现:接口没有属性,只有声明的操如接口类及其实现:接口没有属性,只有声明的操作方法(对方法没有实现部分),而由其实现类具作方法(对方法没有实现部分),而由其实现类具体定义实现部分体定义实现部分l如用例以及实现该用例的协作之间也是实现关系如用例以及实现该用例的协作之间也是实现关系泛化关系和实现关系的异同点泛化关系和实现关系的异同点l泛化和实现关系都可以将一般描述与具体描述联泛化和实现关系都可以将一般描述与具体描述联系起来l泛化将同一语义层上的元素连接起来,并且通常泛化将同一语义层上的元素连接起来,并且通常在同一个模型内。
在同一个模型内l实现关系则将不同语义层内的元素连接起来,通实现关系则将不同语义层内的元素连接起来,通常建立在不同模型内在不同发展阶段可能有两常建立在不同模型内在不同发展阶段可能有两个或多个类等级存在,这些类等级的元素通过实个或多个类等级存在,这些类等级的元素通过实现关系联系在一起现关系联系在一起5.依赖关系依赖关系l关联、实现和泛化都是依赖关系但它们有更特别的语义,关联、实现和泛化都是依赖关系但它们有更特别的语义,所以在所以在UML中被分离出来作为独立的关系中被分离出来作为独立的关系基本的依赖关系基本的依赖关系在依赖关系上可以用在依赖关系上可以用构造型构造型来更具体化依赖的种类来更具体化依赖的种类l1. 使用依赖(使用依赖(Usage))l2. 抽象依赖(抽象依赖(Abstraction))l3. 授权依赖(授权依赖(Permission))l4. 绑定依赖(绑定依赖(Binding)) 1. 使用依赖使用依赖 ----最常使用的依赖最常使用的依赖l表示一种元素表示一种元素(客户客户)使用其它元素使用其它元素(提供者提供者)提供的服务以实现它的行为,包括:提供的服务以实现它的行为,包括:①①使用(使用(《《use》》))②②调用(调用(《《call》》))③③参数(参数(《《parameter》》))④④发送(发送(《《send》》))⑤⑤实例化(实例化(《《instantiate》》))①①使用使用《《use》》:声明使用一个模型元素需要用声明使用一个模型元素需要用到已存在的另一个模型元素,这样才能实现到已存在的另一个模型元素,这样才能实现使用者的功能(包括调用、实例化、参数、使用者的功能(包括调用、实例化、参数、发送)。
发送)②②调用调用《《call》》::声明一个类调用其他类的操声明一个类调用其他类的操作的方法作的方法③③参数参数《《parameter》》::声明一个操作和它的声明一个操作和它的参数之间的关系参数之间的关系④④发送发送《《send》》::声明信号发送者和信号接声明信号发送者和信号接受者之间的关系受者之间的关系例如遥控器和电视机例如遥控器和电视机))⑤⑤实例化实例化《《instantiate》》:声明一个类的方法声明一个类的方法创建了另一个类的实例创建了另一个类的实例注意:注意: 与关联关系不一样的是,依赖关系本身不生成与关联关系不一样的是,依赖关系本身不生成专门的实现代码专门的实现代码2. 抽象依赖抽象依赖l表示客户与提供者之间的关系,依赖于在不表示客户与提供者之间的关系,依赖于在不同抽象层次上的事物,包括:同抽象层次上的事物,包括:①①跟踪(跟踪(《《trace》》))②②精化(精化(《《refine》》))③③派生(派生(《《derive》》))①①跟踪跟踪《《trace》》:表示两个元素代表的是不同模型中的同:表示两个元素代表的是不同模型中的同一个概念通常这些模型分属于开发过程中不同阶段。
一个概念通常这些模型分属于开发过程中不同阶段②②精化精化《《refine》》:表示位于不同的开发阶段或处于不同的:表示位于不同的开发阶段或处于不同的抽象层次中的一个概念的两种形式之间的映射关系并不抽象层次中的一个概念的两种形式之间的映射关系并不意味这两种形式会在最后的模型中共存,它们中一个通常意味这两种形式会在最后的模型中共存,它们中一个通常是另一个的未完善形式是另一个的未完善形式设计类将设计类将《《refine》》在分析过程在分析过程中描述的类中描述的类③③派生派生《《derive》》:声明一个实例可以从另一个实例导出声明一个实例可以从另一个实例导出可以根据提供方的信息计算出客户方可以根据提供方的信息计算出客户方3. 授权依赖授权依赖 l表达一个事物访问另一个事物的能力,被依表达一个事物访问另一个事物的能力,被依赖元素通过规定依赖元素的权限,可以控制赖元素通过规定依赖元素的权限,可以控制和限制对其进行访问的方法包括:和限制对其进行访问的方法包括:①①访问(访问(《《access》》))②②导入(导入(《《import》》))③③友元(友元(《《friend》》))①①访问访问《《access》》:允许一个包访问另一个包:允许一个包访问另一个包的内容。
的内容必须使用路径名称访问必须使用路径名称访问))②②导入导入《《import》》:允许一个包访问另一个包:允许一个包访问另一个包的内容,并为被访问的包的组成部分增加别的内容,并为被访问的包的组成部分增加别名③③友元友元《《friend》》:允许一个元素访问另一个:允许一个元素访问另一个元素,不管被访问的元素是否具有可见性元素,不管被访问的元素是否具有可见性4. 绑定依赖绑定依赖l较高级的依赖类型,用于绑定模板以创建新的较高级的依赖类型,用于绑定模板以创建新的模型元素,包括:模型元素,包括:l绑定(绑定(《《bind》》))例如:例如:C++中的函数模板、类模板中的函数模板、类模板 与具体函数与具体函数和具体类之间的关系和具体类之间的关系类模板(带参数的类类模板(带参数的类parameterized class))lUML中,类矩形框右上角挂着一个小的虚线框,中,类矩形框右上角挂着一个小的虚线框,框中是为了生成具体类所需要指值的参数列表框中是为了生成具体类所需要指值的参数列表当为这些参数指定值时,就说这些参数被绑定到当为这些参数指定值时,就说这些参数被绑定到这些值上这些值上l右上角虚线框中的右上角虚线框中的“T”是一个分类,它说明这个是一个分类,它说明这个类是创建其他类的模板。
类是创建其他类的模板C++提供模板机制,提供模板机制,java中没有与此等价的语法结构中没有与此等价的语法结构类模板类模板C++代码代码#include 生成类的名字l2. 隐式绑定(隐式绑定(implicit binding):):不显示出不显示出依赖关系,绑定参数出现在产生的类名后面,依赖关系,绑定参数出现在产生的类名后面,并用尖括号括起来并用尖括号括起来6.2 类图的绘制类图的绘制类图的抽象层次类图的抽象层次l在软件开发的不同阶段,使用的类图具有不同的在软件开发的不同阶段,使用的类图具有不同的抽象层次抽象层次类图的类图的3个个层次之间没层次之间没有一个很清有一个很清晰的界限,晰的界限,类图从概念类图从概念层到实现层层到实现层的过度是一的过度是一个渐进的过个渐进的过程6.3 对象图对象图对象和类的关系对象和类的关系链链l对象是类的实例,链是类图中关联的实例对象是类的实例,链是类图中关联的实例l链连接的是对象,可以有链名,和对象名一样都要加链连接的是对象,可以有链名,和对象名一样都要加下划线注意:注意:链可以有名称、链可以有名称、角色、但没有多角色、但没有多重性,所有的链重性,所有的链都是一对一的关都是一对一的关系对象图对象图l对象是类的实例,对象图也可看作是类图的实例对象是类的实例,对象图也可看作是类图的实例。 l对象图描述了参与交互的各个对象在交互过程中对象图描述了参与交互的各个对象在交互过程中某一时刻的状态可以认为对象图是类图在某一某一时刻的状态可以认为对象图是类图在某一时刻的实例时刻的实例类对象:只有两栏类图和对象图类图和对象图类图和对象图的区别类图和对象图的区别 类图类图 对象图对象图 类具有三个分栏:名称、属性和操作类具有三个分栏:名称、属性和操作对象只有两个分栏:名称和属性对象只有两个分栏:名称和属性在类的名称分栏中只有类名在类的名称分栏中只有类名对象的名称形式为对象的名称形式为“对象名:类名对象名:类名”,匿名对象的名称形式为,匿名对象的名称形式为“:类名:类名”类中列出了操作类中列出了操作对象图中不包含操作,因为对于属于对象图中不包含操作,因为对于属于同一个类的对象而言,其操作是相同同一个类的对象而言,其操作是相同的的类使用关联连接,关联使用名称、角类使用关联连接,关联使用名称、角色、多重性以及约束等特征定义类色、多重性以及约束等特征定义类代表的是对对象的分类,所以必须说代表的是对对象的分类,所以必须说明可以参与关联的对象的数目明可以参与关联的对象的数目对象使用链连接,链拥有名称、角色,对象使用链连接,链拥有名称、角色,但是没有多重性。 对象代表的是单独但是没有多重性对象代表的是单独的实体,所有的链都是一对一的,因的实体,所有的链都是一对一的,因此不涉及到多重性此不涉及到多重性类的属性分栏定义了所有属性的特征类的属性分栏定义了所有属性的特征对象可以给出属性的当前值,以用于对象可以给出属性的当前值,以用于测试用例或例子中测试用例或例子中6.4 用例分析用例分析分析类分析类UML主要有3种主要的类版型 : 《entity》 《boundary》《control》引入边界类、控制类、实体类的概念引入边界类、控制类、实体类的概念有助于分析和设计人员确定系统中的有助于分析和设计人员确定系统中的类每个每个actor/user case对至少要有一个边界类,但并非每对至少要有一个边界类,但并非每个个actor/user case对都要生成唯一的边界类对都要生成唯一的边界类例如例如:多多个个actor启动一个用例时,可以用一个边界类与系统通信启动一个用例时,可以用一个边界类与系统通信边界类的分类边界类的分类 •用户接口类用户接口类帮助与用户进行通信的类,通过标准的帮助与用户进行通信的类,通过标准的I/O设备提供人机界面设备提供人机界面 •系统接口类系统接口类帮助与其他系统进行通信的类,系统接口帮助与其他系统进行通信的类,系统接口对象隐藏如何与外部接口通信的细节对象隐藏如何与外部接口通信的细节 •设备接口类或设备接口类或Timer 提供对硬件设备的软件接口提供对硬件设备的软件接口实体类实体类l实体类是持久的,是永久保存的信息。 就是保存到数据实体类是持久的,是永久保存的信息就是保存到数据库或文件中实体对象可以出现在多个用例中库或文件中实体对象可以出现在多个用例中l实体类可以通过事件流和交互图发现实体类可以通过事件流和交互图发现l通常,每个实体类在数据库中有相应的表,实体类中的通常,每个实体类在数据库中有相应的表,实体类中的属性对应数据库中表的字段属性对应数据库中表的字段l但这并不意味着,实体类和数据库中的表是一一对应的但这并不意味着,实体类和数据库中的表是一一对应的有可能是一个实体类对应多个表,也可能是多个实体类有可能是一个实体类对应多个表,也可能是多个实体类对应一个表与数据库设计模式有关)对应一个表与数据库设计模式有关)l有时有时Actor也可作为实体类也可作为实体类控制类控制类l控制类是负责其他工作的类它负责协调其他类控制类是负责其他工作的类它负责协调其他类工作和控制总体逻辑流程工作和控制总体逻辑流程l一般每个用例都有一个控制类,控制用例中的事一般每个用例都有一个控制类,控制用例中的事件顺序,控制类也可以在多个用例间共用件顺序,控制类也可以在多个用例间共用l控制类通常被看成一个乐队的指挥,它指挥(控制)控制类通常被看成一个乐队的指挥,它指挥(控制)参与参与use case的其它对象的行为,通知对象什么时的其它对象的行为,通知对象什么时候执行以及执行什么。 候执行以及执行什么l其他类并不向控制类发送很多消息,而是控制类其他类并不向控制类发送很多消息,而是控制类发出很多消息发出很多消息关联可以是双向的关联可以是双向的,,单向的,自关联的单向的,自关联的作业作业1:根据:根据UML类图理解其表示含义类图理解其表示含义作业作业2:根据:根据UML类图理解其表示含义类图理解其表示含义。












