
类图和对象图.doc
19页第5章 类图和对象图在UML中,有两种图非常重要,一种是前面我们讲过的用例图,一种就是我们今天开始要学习的类图实际上我们平时的看到的大多数UML图都是类图,就像Martin Flower在《UML精粹》中说的那样,如果一个人在一条黑暗的胡同中向你走来,并且对你说:“嘿,要不要看一个UML图?”那么,那个图可能就是一个类图类图是使用最广泛的一种模型,用来表述系统中各个对象的类型以及他们之间存在的各种静态关系 要有效的理解和掌握类图,必须首先熟悉类的概念,因此我们首先还是要从面向对象思想出发,再次探究类的内涵5、1类的定义5.1.1面向对象的思想例:假设住在上海的张三要给住在蚌埠的朋友李四送一束鲜花,由于他们之间距离太远,不可能亲自买一个送过去为了解决这个问题,张三登陆到一个电子商务网站购买一束鲜花,并通过该网站将花送给李四而这个电子商务网站实际上就是通过我们蚌埠的某个鲜花店呢来完成这个任务因此在整个传递过程中,各个实体之间有如下的关联关系:显然,现实生活中的情况要复杂的多电子商务网站可以接受很多人的订单,也可以与不同地方的鲜花店合作,以送给更多不同地方的人因此把图5-1进行抽象得到图5-2。
图5-2很好的诠释了类和对象的概念,显然张三是一个对象,可以归到“订货人”这个类中;而蚌埠的某个鲜花店显然也是一个对象,它可以归到“商户”这个类中因此可以说,每个对象都扮演了一个角色,并为其它成员提供特定的服务或执行特定的行为 在我们的例子中,订货人想把完成的事(给李四送鲜花)委托给电子商务网站,而电子商务网站又委托给具体的商户(蚌埠某鲜花店),具体的商户最终通过送货人完成这个行为在实际过程中,张三首先在电子商务网站填写信息,然后电子商务平台向商户发送信息,商户安排送货人完成该动作也就是说:在面向对象世界中,行为的启动是通过将“消息”传递给对此行为负责的对象来完成的;同时还将伴随着执行要求附上相关的信息(参数);而收到该消息的对象则会执行相应的“方法”来实现需求 这就是在面向对象中,用类和对象表示现实世界,用消息和方法来模拟现实世界的核心思想5.1.2 类的定义 在深入了解类的意图后,我们应该了解一下类的组成我们知道类是对一组具有相同属性、操作、关系和语义的对象的描述这些对象包括了现实世界中的物理实体、商业实体、逻辑事物、应用事物等,甚至也包括了纯粹概念性的事物,它们都是类的实例。
关系是类之间的,语义是蕴藏的对于一个类而言,它的关键特性是属性(成员变量)和操作(成员方法)类的 UML 表示是一个矩形,垂直地分为三个区,如图 1显示一个图形如何作为 UML 类建模顶部区域显示类的名字中间的区域列出类的属性底部的区域列出类的操作图 1正如我们所能见到的,这个类的名字是 Shape,在中间区域可以看到Shape 类的4个属性:origin、size、fillcolor、count,其中count有下划线,表示该属性是静态属性在底部区域中Shape类有shape()、move()、resize()和display()4个操作(或者说方法)方法shape()的版型为《constructor》,表示该方法是构造方法,而shape类的版型为《graphics》. 当在一个类图上画一个类元素时,必须要有顶端的区域,下面的二个区域是可以选择的,或者说是可以隐藏的(当图描述仅仅用于显示分类器间关系的高层细节时,下面的两个区域是不必要的)1、 类名类的名称是每个类中所必须有的构成元素,用于同其他的类相区别类的命名应该来自系统的问题域,并且应该尽可能的明确、无歧异因此,类的名字应该是一个名词,并且不应该有前缀或后缀。
类名是一个文本串,表示方法有两种:(1) 简单名simple name :图1中的shape,它就只有一个单独的名称2) 全名:也称路径名path name,就是在类名前面加上包的名字如:Banking::CheckingAccount , Banking是包名,CheckingAccount是包Banking中的一个类对于类的命名规范,UML中并没有明确定义,只要是由字符、数字、下画线组成的唯一的字符串即可但在实际应用中,有一个普遍采用的命名原则:采用CamelCase格式(大写字母开头,混合大小写,每个单词一大写开始,避免使用特殊符号),尽可能避免使用缩写2、 类的属性类的属性节(中部区域)列出了类的每一个属性在UML中,类的属性的语法格式为:[可见性] 属性名 [:类型] [‘[‘多重性[次序]‘]‘] [=初始值] [{特性}] 注意:[ ]内的部分是可选的根据需要,每个属性可以包括属性的可见性、属性名、类型、多重性、初始值和特性1)可见性属性具有不同的可见性可见性描述了该属性(或操作)对于其他类是否可见,以及是否可以被其他类引用,而不仅仅是被该属性所在的类可见类的属性的可见性主要包括公有public、私有private和受保护Protected3种。
如果类的某个可见性是公有可见性,那么可以在这个类的外部使用和查看该属性;如果属性是私有可见性,那么就不能从其他的类中访问这个属性;受保护的可见性,常常与泛化和特化一起使用在 UML中定义了4种可见性,其他种类的可见性可以由编程语言自己定义UML中不存在默认的可见性,如果没有显示任何一种符号,就表示没有定义该属性的可见性2)属性名每个属性必须有一个名字和类中的其他属性相区别通常,属性名由描述所属类的特性的名词或名词短语组成按照UML约定,单字属性名要小写,如例子中的origin、size等如果属性名包含了多个单词,这些单词要合并,并且除第一个单词外其余单词的首字母要大写,如例子中的fillColor.(3)类型属性具有类型,用来说明该属性是什么数据类型象整型、布尔型、实型和枚举等这些简单类型在不同的编程语言中有不同的定义但在UML中,类的属性可以使用任意类型,包括系统中的其他类如在业务类图中,属性类型通常与单位相符,这对于图的可能读者是有意义的(例如,分钟,美元,等等)然而,用于生成代码的类图,要求类的属性类型必须限制在由程序语言提供的类型之中,或包含于在系统中实现的、模型的类型之中4)初始值。
设定初始值有两个好处:保护系统的完整性,防止漏掉取值或被非法的值破坏系统的完整性;为用户提供易用性如,在银行账户应用程序中,一个新的银行账户会以零为初始值显示属性默认值是可选择的;图 2 显示一个银行账户类具有一个名为 balance的类型,它的默认值为05)多重性:表示该属性可能的取值6)特性:是用户对该属性性质的一个约束说明,例如{onlyread}说明该属性的值不能被修改例:属性声明+size: Area= (100,100)#visibility: Boolean = falsename: String[0..1]point:Point[2..* ordered]3、 类的操作操作是类所提供的服务,用于修改、检索类的属性或执行某些动作操作通常也叫做函数或方法,它们位于类的内部,并且只能作用于该类的对象上操作的语法格式为:[可见性] 操作名 [(参数列表)] [:返回类型] [{特性}] 注意:[ ]内的部分是可选的1) 可见性,与属性的可见性类似2) 操作名:用来描述所属类的行为的动词或动词短语,命名规则和属性名的情况类似5.2 类之间的关系类之间最常用的关系有4种,即关联、依赖、泛化和实现关系。
5.2.1 关联关联是模型元素间的一种语义联系如:一个人为一家公司工作,一家公司有许多办公室我们就认为人和公司、公司和办公室之间存在某种语义上的联系注意:链和关联就像对象是类的实例,链是关联的实例,类之间的关联表示类与类之间的关系,而链表示对象和对象之间的关系在UML类图中,关联关系用一条连接两个类的实线表示如图:关联的任何一个连接点都叫做关联端,一个关联可以有两个或多个关联端,每个关联端连接到一个类除了以上关联的基本形式外,还有几种应用于关联的修饰,如分别是关联名、角色、多重性、聚合、组合和导航性等等1、 关联名关联可以有名称,用来描述关联的性质和作用如图所示是一个使用关联名的例子,其中类Company和Person之间的关联如果不使用关联名,可以有多种解释如Person类可以表示公司的客户、雇员或所有者等等但如果在关联上加了Employs这个关联名,则表示Company类和Person类之间是雇佣关系这样可以使得类之间的关联语义更加清晰明确通常,关联名是一个动词或动词短语此外,为了消除名称含义的歧义,还可以提供一个指引读名称方向的实心三角形,给名称一个方向在类图中,并不需要给每个关联都加上关联名。
只有在需要明确的给关联提供角色名,或一个模型存在多个关联且要查阅、区别这些关联时才给出关联名2、 关联的角色关联两端的类可以以某中角色参与关联角色是关联关系中一个类对另一个类所表现出来的职责当类出现在关联的一端时,该类就在关联关系中扮演了一个特定的角色角色的名称是名词或名词短语如图,类Company以employer的角色,Person类以employee的角色参与关联Employer和employee称为角色名如果在关联上没有标出角色名,则隐含的用类名作为角色名相同类可以在其他的关联中扮演相同或不同的角色3、 多重性multiplicity约束是UML的三大扩展机制之一,多重性是其中的一种约束,也是使用最广泛的一种约束多重性又叫重数,用来说明关联的两个类之间的数量关系;或者说关联的多重性是指有多少对象可以参与该关联,它可以用来表达一个取值范围、特定值、无限定的范围或一组离散值多重性的格式为:n..m ,其中整数n定义所连接的最少对象的数目,m则是最多对象数(当不知道确切的最大数时,UML中用*表示最大数,Rose中则用n来表示常见多重性定义表示含义0..10个或1个1(1..1)只能1个0..* (0..n)0个或多个*(0..n)0个或多个1..* (1..n)1个或多个3只能3个0..50到5个5..155到15个 雇主(公司)可以雇佣多个雇员,表示为0..n;而雇员只能被一家公司雇佣,表示为1. 多重性是用非负整数的一个子集来表示。
4、 导航性关联也可以有方向,即导航性,在关联关系上加上导航箭头表明可以从源类的任何对象到目标类的一个或多个对象箭头指向的是目标类,另外一边则是源类只在一个方向上有箭头的关联称为单向关联;在两个方向上都可以导航的是双向关联,用一条没有箭头的实线表示,等价于两端都有箭头5、 关联类在两个类之间的关联中,关联本身也可以有特性例如,在company和person之间的雇主/和雇员关系中,有一个描述该关联特性的contract.,它只应用于一对company和personContract类中的属性Salary和dateHired,描述的是company类和person类之间的关联关系,而非描述的company类或和person类的属性在UML中,把这种情况建模为关联类,关联类可以进一步描述关联关系的属性、操作以及其他信息关联类是一种具有关联特性和类特性的建模元素,可以把它看成是具有类特征的关联或是具有关联特征的类关联类通过一条虚线与相应得关联连接生成Java代码6、 关联的约束。
