uml基础教程第四章-类图和对象图.ppt

上传人:小飞机 文档编号:6522288 上传时间:2023-11-08 格式:PPT 页数:175 大小:4.04MB
返回 下载 相关 举报
uml基础教程第四章-类图和对象图.ppt_第1页
第1页 / 共175页
uml基础教程第四章-类图和对象图.ppt_第2页
第2页 / 共175页
uml基础教程第四章-类图和对象图.ppt_第3页
第3页 / 共175页
uml基础教程第四章-类图和对象图.ppt_第4页
第4页 / 共175页
uml基础教程第四章-类图和对象图.ppt_第5页
第5页 / 共175页
点击查看更多>>
资源描述

《uml基础教程第四章-类图和对象图.ppt》由会员分享,可在线阅读,更多相关《uml基础教程第四章-类图和对象图.ppt(175页珍藏版)》请在三一办公上搜索。

1、第四章 类图和对象图,第四章 类图和对象图,本章导读,知道类图和对象图的表示方法掌握类的属性、操作和关系了解类的识别方法,4.1 类图的定义,类图指的是对系统中的各种概念进行建模并描绘出它们之间关系的图。它描述了系统的静态结构。类图通过系统中的类以及各个类之间的关系来描述系统的静态方面。在类图中,一共包含以下几种模型元素,即类(Class)、接口(Interface)、依赖(Dependency)关系、泛化(Generalization)关系、关联(Association)关系以及实现(Realization)关系。,由于静态视图主要用于支持系统的功能性需求,也就是系统提供给最终用户的服务,而

2、类图的作用是对系统的静态视图进行建模。当对系统的静态视图进行建模时,通常用以下3种方式来使用类图:(1)模型化简单的协作(2)模型化逻辑数据库模式(3)为系统的词汇建模,4.2 类的构成,类是面向对象系统组织结构的核心。类是对一组具有相同属性、操作、关系和语义的对象的描述,类之间共享属性与服务的机制即为继承。在UML图形表示中,类的表示法是一个矩形,分别是类的名称(Name)、类的属性(Attribute)和类的操作(Operation)。,类的名称位于矩形的顶端,类的属性位于矩形的中间部位,而矩形的底部显示类的操作。中间部位不仅显示类的属性,还可以显示属性的类型以及属性的初始化值等。矩形底部

3、也可以显示操作的参数表和返回类型等。,4.2.1 名称,类名称是每个类的图形中所必须拥有的元素,用于同其他类进行区分。类的名称通常是来自于系统的问题域,并且尽可能地明确表达要描述的事物,不会造成类的语义冲突。类的名称是一个名词,且不应该有前缀或后缀。,在UML中一个矩形表示一个类的图标,按照UML约定,类的名称的首字母应当大写,放在矩形的偏上部。如果类的名称由两个单词组成,那么将这两个单词合并,第二个单词首字母也大写(如WashingMachine)。如图4-4。类在它的包含者内有唯一的名称,这个包含者通常可能是一个包,但也可能是另外一个类。,在类中,默认显示包含该类所在的名称。如图4-5。如

4、果WashingMachine(洗衣机)类是Househould(家用品)包的一部分,那么这个类的名字为:Househould:WashingMachine。包名在左,类名在右,中间用双冒号隔开。这种类型的类名叫路径名(pathname)。,操作指的是类所能做的事情,或者另一个类能对类做的事情。类的操作可以根据不同的可见性由其他任何对象请求以影响其行为。属性是描述类的对象特性的值,而操作用于操纵属性的值进行改变或执行其他动作。操作有时被称为函数或方法,在类的图形表示中它们位于类的底部。一个类可以有零个或多个操作,并且每个操作只能应用于该类的对象。,4.2.2 操作,操作由一个返回类型、一个名称

5、以及参数来描述。其中,返回类型。名称和参数一起被称为操作签名。操作签名描述了使用该操作所必需的所有信息。操作的语法表示为:可见性操作名称(参数表):返回类型 属性字符串 如 表4-1,1.可见性 描述了该操作是否对于其他类可见,从而是否可以被其他类引用。类中的可见性操作有3种,分别是公有类型(public)、受保护类型(protected)和私有类型(private)。在Rational中还添加了实现(Implementation)选项。如 表4-2,2.操作名称 类的每个操作都必须有一个名称以区别于类中的其他操作。通常情况下,操作名由描述所属类的行为的动词或动词短语构成。和属性的命名一样,操

6、作名称的第一个字母小写,如果操作名称包含多个单词,那么单词需要进行合并,并且除了第一个英文单词外其余单词的首字母要大写。,操作名列表放在属性名列表之下,两者之间用分隔线隔开,如图所示:,3.返回类型 返回类型指定了由操作返回的数据类型。它可以是任意有效的数据类型,返回类型至多一个。如果操作没有返回值,在具体编程语言中一般要加上一个关键字void来表示,也就是其返回类型必须是void。4.属性字符串 用来附加一些关于操作的除了预定义元素之外的信息,方便对操作的一些内容进行说明。,5.参数表 还可以为操作指定附加信息,在操作名后面的括号中可以说明操作所需要的参数和参数的类型。有一种操作叫函数,它在

7、完成操作后要返回一个返回值,可以指明函数的返回值及返回值的类型。参数表由类型、标识符对组成的序列,实际是操作或方法被调用时接收传递过来的参数值的变量。参数的定义方式为:名称:类型 如果存在多个参数,则将各个参数用逗号隔开。如果方法没有参数,则参数表就是空的。参数可以具有默认值。,上述全部的操作信息被称为操作的型构(signature)。如下图:,属性描述了在软件系统中所代表的对象具备的静态部分的公共特征抽象,这些特征是这些对象所共有的。属性是类的一个特性,它描述了类的对象(也就是类的实例)所具有的一系列特性值。一个类可以具有零个或多个属性在UML中,类的属性的表示语法为:可见性 属性名称:属性

8、类型=初始值 属性字符串 如 表4-3所示,4.2.3 属性,1.可见性 属性的可见性描述了该属性是否对于其他类可见,从而确定是否可以被其他类引用。类中属性的可见性和类的操作的可见性一样,也有3种。分别是公有类型(public)、受保护类型(protected)和私有类型(private)。在Rational中还添加了实现(Implementation)选项。,2.属性名称 属性是类的一部分,每个属性都必须有一个名字以区别于类中的其他属性。通常情况下,属性名由描述所属类的特性的名词或名词短语构成。按UML约定,单字属性名小写,如果属性名包含了多个字,要合并这些单词,并且除了第一个英文单词外其余

9、但系的首字母要大写。属性名列表放在类名之下,并且和类名之间用分隔线隔开。,3.属性字符串 用来指定关于属性的一些附加信息,如某个属性应该在某个区域是有限制的。任何希望添加在属性定义字符串中但又没有合适地方可以加入的规则,都可放在属性字符串中。,4.初始值 在程序语言设计中,设定初始值通常有两个用处:首先,用来保护系统的完整性。例如,在编程中,为了防止漏掉对类中某个属性的取值,或者防止类的属性在自动取值的时候会破坏系统的完整性,可以通过赋初始值的方法保护系统的完整性;其次,为用户提供易用性。设定一些初始值能够有效帮助用户进行输入,从而能够为用户提供很好的易用性。,类的属性在该类对象中都有具体值,

10、如下图:,5.属性类型 用来指出该属性的数据类型。典型的属性的类型包括Boolean、Integer、Byte、Date、String和Long等。当一个类的属性被完整定义后,它的任何一个对象的状态都由这些属性的特定值所决定。,属性可以带类型和缺省值,如下图:,4.2.4 注释,使用注释可以为类添加更多的描述信息,也是为类提供更多的描述方式中的一种。如 图4-6所示。通常对属性或者操作添加一个注释。下图的注释说明了serialNumber(序列号)属性引用了政府标准,根据这个注释就可以参考相关标准以查阅如何生成 WashingMachine类对象的serialNumber属性值。,4.2.5

11、约束,类的约束指定了该类所要满足的一个或多个规则。在UML中,约束是用一个大括号括起来的文本信息。如图4-7。例如,你想指定WashingMachine类洗衣机的容量只能是16、18或者20磅(也就是对WashingMachine类的capacity属性施加约束),你可以在WashingMachine类图标的旁边写一个约束“capacity=16 or 18 or 20 Ib”,,capacity=16 or 18 or 20,4.2.6 职责,类的职责指的是对该类的所有对象所具备的那些相同的属性和操作共同组成的功能或服务的抽象。职责描述了类做什么也就是类的属性和操作能完成什么任务。例如,一台

12、洗衣机的职责是将脏衣服作为输入,输出洗干净的衣服。(Take dirty clothes as input and produce clean clothes as output)。,类的属性和操作是对类的具体结构特征和行为特征的形式化描述,而职责是对类的功能和作用的非形式化描述。有了属性、操作和职责,一个类的重要语义内容就基本定义完毕了。在声明类的职责的时候,可以非正式地在类图的下方增加一栏,将该类的职责逐条描述出来。类的职责其实只是一段或多段文本描述。,4.3 UML中不同的类,在本节中需要掌握的内容有:如何对类之间的关系建模;如何可视化类和子类的关系;如何表现类之间的依赖。,Class类

13、型的类是我们说的普通类,还有两种比较常用的类型是ParameterizedClass、InstantiatedClass,分别代表参数化类和实例化类。,1.实例化类(InstantiatedClass)实例化类具有实际变元值的参数化类。类的事物抽象,参数化类是更高一等的抽象,指明一群有类似属性和行为的类。通过参数的具体化,能产生出不同的类,这种具体化的类就是实例化类。,2.参数化类(ParameterizedClass)参数化类通常用于创建一系列其他类。可以说,参数化类就是某种容器,所以也被称为模板类。模板类的是对一个参数化类的描述符。模板体可能包含代表模板本身的缺省元素,还包括形式参数。通过

14、把参数绑定到实际值上就可以生成一个实际的类。,模板类的属性和操作可以用形式参数来定义。在UML表示中,模板类的表示形式如图4-8所示。模板类不是一个直接可用的类。必须把它的参数绑定到实际的值上以生成实际的类。只有实际的类才可以作为关联的父亲或者目标(但是允许从模板到另一个类的单向关联)。,4.4 构造型,1.实体类(Enity)在实体类中保存需要放进永久存储体的信息。比如为数据库中的每一个表创建一个实体类,在数据表中永久存储记录信息,而实体类在系统运行时在内存中保存信息。如图4-9所示。,2.控制类(Control)控制类用来负责协调其他类的工作,通常本身并不完成任何功能,其他类也不向其发送很

15、多消息,而是由控制类以委托责任的形式向其他类发送消息。控制类有权知道和执行机构的业务规则,并且可以执行其他流,知道在发生错误时如何对错误进行处理。如图 4-10所示,3.边界类(Boundary)边界类位于系统与外界的交界处,包括所有窗体、报表、打印机和扫描仪等硬件的接口以及与其他系统 的接口。在UML中,边界类的表示如 图4-11。,4.5 类之间的关系,类和类之间最常用的关系通常有4种,分别是依赖关系、泛化关系、关联关系和实现关系。如表 4-4 类之间的关系,4.5.1 泛化关系(继承),泛化关系用来描述类的一般和具体之间的关系。具体描述建立在对类的一般描述的基础之上,并对其进行了扩展 泛

16、化关系使用从子类指向父类的一个带有实线的箭头来进行表示,指向父类的箭头是一个空三角形,每一个分支指向一个子类。在泛化关系中,一般描述的类被称为父类,具体描述的类被称为子类。,泛化关系,空心三角形箭头的实线,子类指向父类。代码中通常有extends关键字(Java)。,完全泛化,泛化关系描述的是“is a kind of”(是。的一种)的关系,它使父类能够与更加具体的子类连接在一起,有利于对类的简化描述,可以不用添加多余的属性和操作信息,通过相关继承的机制从其父类继承相关的属性和操作 子类除了继承父类的属性和操作外,通常也增加了自己的属性和操作。,一个类可能没有父类,这种没有父类的类被称为基类(

17、base class)或根类(root class);一个类也可以没有子类,没有子类的类被称为叶类(leaf class)。如果一个类恰好只有一个父类,这样的继承关系叫做单继承(single inheritance)。如果一个类有多个父类,这样的继承就是多继承(multiple inheritance)。,泛化关系具有3个重要的作用。(1)用来定义可代替性原则 即当一个变量被声明承载某个给定类的值时,可使用类的实例作为值,这被称为可替代性原则。该原则表明声明了祖先,则后代的一个实例就可以被使用(2)使得多态操作称为可能,即操作的实现是由它们所使用的对象的类,而不是由调用者确定的。这是因为一个父

18、类可以有许多子类,每个子类都可实现定义在类整体几种的同一操作的不同变体。,(3)在共享祖先所定义的成分的前提下允许它自身定义增加的描述,这被称为继承。继承是一种机制,通过该机制可以将对类的对象的描述从类及其祖先的声明部分聚集起来。继承允许描述的共享部分只被声明一次便可以被许多类所共享,而不是在每个类中重复声明并使用它,这种共享机制减小了模型的规模。,两个类之间具有继承关系。例如人和学生,学生继承了人,除过具有人的一般的属性和方法之外,他还要有学习的方法。对应的UML图如下所示泛化用空心三角形+实线表示。下图表示Student继承PeopleStudent继承自People,并且多了一个stud

19、y的方法。,class People protected String name;protected String sex;protected Date birthday;public void eat()System.out.println(name+正在吃饭.);public void drink()System.out.println(name+正在喝水.);public void sleep()System.out.println(name+正在休息.);class Student extends People public void study()System.out.println

20、(name+正在学习.);,4.5.2 实现关系,在UML中,有一个专门的建模元素可以用于对类或部件所提供的服务进行描述,这就是接口(Interface)。UML接口描述的是一系列的方法,这些方法为一个类或部件规定了其必须提供的服务。,(6)接口支持多继承,而抽象类仅仅支持单继承,接口被建模为实现(Realization)关系。实现关系将一种模型元素(如类)与另一模型元素(如接口)连接起来,从而说明和其他实现之间的关系。由实现关系指定二者之间的一个合同(Contract),一个模型元素定义一个合同,而另一个模型元素保证履行该合同。也就是说,关系中的一个模型元素只具有行为的定义,而行为的具体实现

21、规则是由另一个模型元素来给出的。,在实现关系中,抽象类或接口只是行为的说明而不是结构或者实现,而类中则要包含其具体的实现内容,可以通过一个或多个类实现一个抽象类或接口,但每个类必须分别实现抽象类或接口中的操作。在UML中,实现关系使用一条带封闭空箭头的虚线来表示,如图4-15。接口可以使用一个圆圈来表示,并通过一条实线附在表示类的矩形上来表示实线关系,如图4-16所示。,接口只是行为定义而不是结构或实现,接口中的属性都是常量,方法都是抽象方法。接口只是与外界接触时输入、输出格式的定义。接口只是一个口,它的里面是空的泛化和实线关系都可以将一般描述与具体描述联系起来。泛化将在同一语义层上的元素连接

22、起来(如在同一抽象层),并且通常在同一模型内。实线关系将在不同语义层内的元素连接起来,并且通常建立在不同的模型内。在不同发展阶段可能有两个或更多的类等级,这些类等级的元素通过实线关系联系起来。,空心三角形箭头的虚线,实现类指向接口。代码中通常有implements关键字(Java)。,类CarDriver和PlaneDriver都实现了Driver接口,代码,public interface Driver void drive();class CarDriver implements Driver public void drive()System.out.println(驾驶汽车.);cla

23、ss PlaneDriver implements Driver public void drive()System.out.println(驾驶飞机.);,4.5.3 依赖关系,依赖(Dependency)是两个事物间的语义关系,其中一个事物(称为服务的提供者)发生变化,会影响到另一个事物(称为客户或服务的使用者),或向它(客户)提供所需信息。在类与类之间应用依赖关系指明一个类使用另一个类的方法或一个类使用其它类所定义的属性和方法。依赖表示的是两个或多个模型元素之间语义上的连接关系。它只将模型元素本身连接起来,而不需要用一组实例来表达它的意思。最通常的依赖关系是一个类操作的型构中用到另一个类

24、的定义。,它表示了这样一种情形,提供者的某些变化会要求或指示依赖关系中客户的变化。也就是说依赖关系将行为和实现与影响其他类的类联系起来。依赖关系还经常用来具体实现间的关系,如代码层的实现关系。在概括模型的组织单元(如包)时,依赖关系很有用,它在其上显示了系统的架构,如编译方面的约束可通过依赖关系来表示。依赖关系使用一个虚箭头来表示,并且使用一个构造型的关键字位于虚箭头之上来区分依赖关系的种类。,依赖表示类之间的调用(使用)关系,通常是类A中的方法需要类B的实例作为其参数或者变量,而类A本身并不需要引用类B的实例作为其成员变量或者说属性(这个和关联不一样)。虚线+箭头,类A指向类B,依赖是一种使

25、用关系,它表示了一个事物说明的变化可能影响到使用它的另一个事物,但反之未必。也就是说,服务的使用者以某种方式依赖于服务的提供者。而关联是一种结构关系,它详述了一个事物的对象与另一个事物的对象的相互联系,例子,自行车和打气筒,自行车通过打气筒来充气,那么就需要调用打气筒的充气方法。对应的UML图如下所示:打气筒并不属于某个特定的自行车,一个打气筒可以为多个自行车提供充气的服务。在Bicycle中不需要定义Pump类型的属性,而是将传递了一个Pump类型的参数到Bicycle的方法中。,例子 代码,class Bicycle public void expand(Pump pump)pump.bl

26、ow();class Pump public void blow()System.out.println(正在充气.);,依赖(Dependency)总结,【依赖关系】:是一种使用的关系,即一个类的实现需要另一个类的协助,所以要尽量不使用双向的互相依赖.【代码表现】:局部变量、方法的参数或者对静态方法的调用【箭头及指向】:带箭头的虚线,指向被使用者,4.5.4 关联关系,关联(Association)表示一个对象拥有另一个对象。当类之间在概念上有连接关系时,类之间的连接叫做关联(association)。篮球比赛的初步模型中提供了这样的例子 让我们来研究其中的一个关联队员和球队之间的关联。可以

27、用一个短语“队员为篮球队效力(“Play on”)来刻画这个关联。关联的可视化表示方法是用一条线连接两个类,并把关联的名字(例如“Play on”)放在这个连接线之上。关联的方向用一个实心三角形箭头来指明。,通常是类A中需要引用另一个类B的实例作为成员变量,表示类A需要“知道”类B。实线箭头,类A指向类B。,(一)关联名 为了方便人们的阅读,关联通常有一个名称,这个名称应该选用一个动词词组。关联可以有名称,用来描述关联的性质和作用。关联关系通常是在分析过程中命名的,此时还没有足够的信息对角色进行适当的命名。如果使用关联关系名称,关联关系名称就应该反映该关系的目的,关联关系名称应放置在关联关系路

28、径上或其附近,并且用一个实心箭头表示关联名称的发生分那个上。,(二)关联的角色 当一个类和另一个类发生关联时,每个类通常在关联中都扮演着某种角色。角色是关联关系中一个类对另一个类所表现出来的职责。可以在图中靠近每个类的地方的关联线上标明每个类的角色。每个角色都必须有名称,而且对应一个类中所有角色的名称都必须是唯一的。角色名称应该是一个名词,以描述在特定的环境中关联的行为或职责。关联角色是对一个关联的特殊说明,关联角色的命名应该能够表达被关联关系对象的角色与关联关系对象之间的关系。,(三)多重性 多重性表示一个类同时拥有的实例的数目,它描述的是一个类的多少对象与另一个类的一个对象相关,可用一个单

29、一的数字或一个数字序列表示。多重性应放在被拥有的类的附近。在UML中,多重性是使用“.”分开的两个数值区间来表示的,其格式为“minimum.maximum”,其中minimum和maximum都是整数。当一个端点给出多少赋值时,就表示该端点可以有多个对象与另一端点的一个对象进行关联。,若类A和类B之间有关联关系,多重性定义了类A有多少个实例可以和类B的一个实例关联。常用的多重性表达方式如表:,说明:UML中用*表示不确切的最大数,Rose中用n表示。,多重性的值表示在特定时刻(而不是在某个时间跨度内)有效关联的实例数量。例如,一个Person可能在某段时间内被多个Company雇佣,但是在某

30、一时刻这个Person只能被一个Company雇佣,表示为1;而在某一时刻这个Company可以雇佣0到多个Person,表示为0.n。多重性实际上是一种约束。,(四)导航性 关联关系加上导航箭头,由源对象指向目标对象,表明在运行时刻从源类的一个对象可以找到目标类的一个或多个对象(取决于关联端的多重性)。多重性放置在目标一端,而不是源端。只在一个方向上有导航性箭头的关联称为单向关联;在两个方向上都可以导航的是双向关联,用一条没有箭头的实线表示,等价于两端都有箭头。,(五)关联类 如果一个关联既是类又是关联,那么它是一个关联类。关联类是一种具有关联特征和类特征的建模元素,可以把它看成是具有类特征

31、的关联或具有关联特征的类。关联类的可视化表示方式与一般的类相同,但是要用一条虚线把关联类和对应的关联线连接起来。如图4-19所示。,(六)关联的约束 两个关联之间有一条虚线,上面写着xor。在UML中,这种以大括号括起来的,放在建模元素外面的字符串就是约束。约束可以是自由文本。在关联上加上约束,可以加强关联的含义。,(七)限定关联 当关联的多重性是一对多时,就产生了一个特殊问题:查找问题。当一个类的对象必须要选择规则中另一类的特定对象来满足关联中的角色时,第一个类必须要依赖一个具体的属性值来找到正确的对象。这个属性值通常是一个标识符号,例如一个ID号。存在限定符(Qualifier)的关联称为

32、限定关联(Qualified Association),限定关联用于多重性为一对多或多对多的关联。限定符画成一个内标限制内容的小方块,链接在它所限定的类上。,数组非常典型地可以被建模为一个受限定的关联。数组是受限定对象,数组下标是限定符,而数组元素就是目标对象。引入限定符的一个目的是把多重性从n将为1或0.1,这样如果做查询操作,那么返回的对象最多是一个,而不是一个对象集。如果查询操作的结果是单个对象,则这个查询操作的效率比较高。,(八)派生属性和派生关联 是指可以从其他属性和关联计算推演得到的属性和关联。派生用图标“/”表示。,(九)关联的种类 一个关联可以有两个或多个关联端,每个关联端连接

33、到一个类。而根据关联所连接类的数量,类之间的关联可以分为3种关联:自身关联、二元关联和N元关联(多元关联)。1、自身关联 有时一个类可能与它角色自己发生关联,这样的关联被称为自身关联(reflexive association)。当一个类的对象可以充当多种角色时,自身关联就可能发生。,2、二元关联 最普通的关联是一对类之间的二元关联,即在两个类之间的关联。二元关联使用一条连接两个类的连线表示,连线上有相互关联的角色名而多重性则加在各个端点上。3、N元关联 指在3个或3个以上类之间的关联。N元关联中多重性的意义是:在其他N-1个实例值确定的情况下,关联实例元组的个数。,例子,关联是指两个类之间存

34、在某种特定的对应关系,例如客户和订单,一个订单只能属于某个客户,一个客户可能会有多张订单。根据方向,分为单向和双向。根据对应的数量分为一对一、一对多、多对多等。关联关系用实线+箭头表示。下图显示Customer和Order是双向一对多关联关系。那么在Customer中应该有Order的集合,在Order中应该Customer的属性。,例子-代码,class Customer private Integer id;private String name;private Set orders;public Set getOrders()return orders;public void setOr

35、ders(Set orders)this.orders=orders;class Order private Integer id;private float money;private Customer customer;public Customer getCustomer()return customer;public void setCustomer(Customer customer)this.customer=customer;,关联(Association)总结,【关联关系】:是一种拥有的关系,它使一个类知道另一个类的属性和方法;如:老师与学生,丈夫与妻子关联可以是双向的,也可以

36、是单向的。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。【代码体现】:成员变量【箭头及指向】:带普通箭头的实心线,指向被拥有者,4.5.5 特殊关联聚合和组合,1、组合关系 组合也表示整体与部分的关系,它是聚合关系中的一种特殊情况,是更强形式的聚合,在整体中拥有管理部分的特有的职责,有时也被称为强聚合关系。在组合中,部分与整体具有相同的生命周期,“部分”对象完全依赖于“整体”对象。这种依赖性表现在两个方面:第一,部分对象一次只能属于一个组合对象;第二,当组合对象销毁时,它的所有从属部分都必须同时销毁。在UML中,组成关系使用带实心菱形头的实线来表示,其中头部指向整体。,通常需要在

37、实例化类A的同时在其构造方法之中实例化类B,使类B作为类A的一部分,表示一个强的“拥有”关系,即类B是类A的一部分,二者共生命周期,具有严格的“整体部分”关系。尾部为实心菱形的实现箭头,类A指向类B。,例子,组合和聚集中的类都是整体与部分的关系,与聚集不同的而是,其中的类不能对立出来。例如一个人由头、手、腿和躯干等组成,如果这个头离开了这个人,那么这个头就没有任何意义了。下图表示People是由Head、Hand、Leg等组成,People和Head、Hand、Leg是不可分割的,Head、Hand、Leg离开了People没有任何实际意义。在People中定义了Head、Hand、Leg类型

38、的属性,组合也可以看成是聚合的一种特殊形式。,代码,class People private Head head;private Hand hand;private Leg leg;public void think()head.think();public void holdThing()hand.holdThing();public void walk()leg.walk();class Head public void think()System.out.println(思考.);class Hand public void holdThing()System.out.println(拿

39、东西.);class Leg public void walk()System.out.println(走路.);,组合(Composition)总结,【组合关系】:是整体与部分的关系,但部分不能离开整体而单独存在.如公司和部门是整体和部分的关系,没有公司就不存在部门.组合关系是关联关系的一种,是比聚合关系还要强的关系,它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期【代码体现】:成员变量【箭头及指向】:带实心菱形的实线,菱形指向整体,2、聚集(聚合)关系一个类有时是由几个部分类组成的。这种特殊类型的关系被称为聚集(aggregation)。部分类和由它们组成的类之间是一种整体

40、部分(part-whole)关联。聚集关系描述的是部分与整体关系的关联,即它将一组元素通过关联组成一个更大、更复杂的单元,这种关联关系就是聚集。聚集关系的含义是“聚”在一起,也就是表示“部分”可以独立于“整体”而存在。在UML中,它用端点带有空菱形的线段来进行表示,空菱形与聚集类相连接,其中头部指向整体。,通常是类A中需要包含另一个类B的实例或实例的集合,表示一种弱的“拥有”关系,即类A包含类B,但类B不是类A的一部分,而是一个独立存在的类。尾部为空心菱形的实线箭头(空心菱形+实线表示),类A指向类B。,例子,聚合是整体与部分之间的关系。例如计算机和主板,计算机是一个整体,主板是其中的一部分,

41、主板、显卡、显示器等部件组成了计算机。对应的UML图如下所示:计算机由主板、显卡等部件组成,所以在Computer中定义了MainBoard和DisplayCard类型的属性。聚合中类之间可以独立出来,比如一块主板可以装在A计算机上,也可以装在B计算机上。也就是说这块主板离开A计算机之后仍然是有意义的。,代码,class Computer private MainBoard mainBoard;private DisplayCard displayCard;public void on()System.out.println(开启计算机.);public void close()System.

42、out.println(关闭计算机.);public void run()System.out.println(计算机正在运行.);class MainBoard public void control()System.out.println(控制计算机.);class DisplayCard public void display()System.out.println(计算显示数据.);,聚合(Aggregation)总结,【聚合关系】:是整体与部分的关系,且部分可以离开整体而单独存在.如车和轮胎是整体和部分的关系,轮胎离开车仍然可以存在.聚合关系是关联关系的一种,是强的关联关系;关联和聚

43、合在语法上无法区分,必须考察具体的逻辑关系。【代码体现】:成员变量【箭头及指向】:带空心菱形的实心线,菱形指向整体,3、何时使用聚合和组合 聚合和组合是比较容易混淆的概念,实际应用中很难确定是用聚合还是组合关系。因而在设计时,采用聚合还是组合,要根据应用场景判断部分类和整体类之间的关系。,聚合和组合的代码几乎相同,单凭代码是无法区分两个类之间是聚合还是组合的关系的。所以就需要结合实际的业务环境来区分。例如汽车和轮胎,车主买了一辆汽车,上边肯定是由轮胎的,在这个业务中,轮胎和汽车是组合关系,它们分开就没有实际意义了。在汽车修理店,汽车可以更换轮胎,所以在汽修店的业务环境中,汽车和轮胎就是聚合的关

44、系,轮胎离开汽车是有业务意义的。,各种关系,各种关系的强弱顺序:泛化=实现 组合 聚合 关联 依赖下面这张UML图,比较形象地展示了各种类图关系:,总结,值得注意的是,关联、依赖、聚合、组合的关系很容易搞混。当对象A和对象B之间存在关联、依赖、聚合或者组合关系时,对象A都有可能调用对象B的方法。这是它们的相同之处。另外它们还有自己的特征。对于两个相对独立的对象A和B,当一个对象A的实例与B的实例存在固定的对应关系时,这两个对象之间为关联关系。代码中表现为在A中定义了B类型的属性。对于两个相对独立的对象A和B,当一个对象A负责构造对象B的实例,或者调用对象B提供的服务时,这两个对象之间主要体现为

45、依赖关系。代码中的表现即将B类型的参数传入A的方法中,而不是在A中定义B类型的属性。聚合、组合与关联在代码中并没有明显的区别,主要看实际的业务环境,根据代码所处的实际业务环境来判断它们之间的关系。同样的两个类,处在不同的业务环境中,可能它们的关系也不相同。,4.6 类的识别,类的识别是面向对象方法的一个难点,但又是建模的关键。在分析阶段,类的识别通常由分析人员在分析问题域的基础上完成。类的识别是面向对象方法的一个难点,但又是建模的关键。常用的方法有:名词识别法、实体识别法、用例识别法、CRC法等。,4.6.1 名词识别,这种方法的关键是识别问题域中用到的名词或者名词短语来描述的实体,通过对系统

46、简要描述进行分析,在提出实体对应名词的基础上识别类,名词识别法的步骤如下:(1)按照指定的语言对系统进行描述,描述过程应与领域专家共同合作完成,并遵循问题域中的概念和命名。(2)从系统中标识出名词、代词、名词短语,并以此标识为初始的类。(3)识别、确定类。并非所有列出的名词、代词、名词短语都是类,应根据一定的原则进行识别和确定。,案例银行网络ATM系统,一、问题的陈述 银行网络系统包括人工出纳和分行共享的自动出纳机;各分理处用自己的计算机处理业务(保存账户、处理事务等);各分理处与出纳站通过网络通信;出纳站录入账户和事务的数据;自动出纳机与分行计算机通信;自动出纳机与用户接口,接受现金卡;发放

47、现金;打印收据;分行计算机与拨款分理处结账。要求系统正确处理同一账户的并发访问;网络费用平均摊派给各分理处。,根据下述原则进一步确定类:去掉冗余类:如两个类表述同一信息,应保留最具有描述能力的类。,去掉不相干的类:删除与问题无关或关系不大的类,删除模糊的类:有些初始类边界定义不确切,或范围太广,应该删除。,删除那些性质独立性不强的,而应该是类“属性”的候选类。,所描述的操作不适宜作为对象类,并被其自身所操纵,所描述的只是实现过程中的暂时的对象,应删去。,4.6.2 实体识别,这种方法和名词识别法很相似,但其关心的是构成系统的实体,而不关心系统的运作流程及实体间的通信状态、通常将实体识别法和名词

48、识别法联合使用。被标识的实体通常有系统需要存储/分析/处理信息的实体、系统内部需要处理的设备、与系统交互的外部系统、系统相关人员、系统的组织实体等类型。,系统中的信息实体,往往可以直接识别为类,如职工工资;系统需要处理的设备,可以命名一个同名的类来管理系统对该设备的操作,如一个传感器类;而将与本系统交互的外部系统看成一个黑盒子,不关心其内部细节,只关心本系统与外部系统的交互情况,可以将其抽象为类。,例:有一个购物超市,顾客可在货架上自由挑选商品,由收款机收款,收款机读取商品上的条形码标签,并计算商品价格。收款机应保留所有交易的记录,以备账务复查、清理货存及汇总使用。,4.6.3 用例识别,用例

49、图是对系统功能的描述,可以根据用例描述来识别类。该方法和实体识别法很相似,但实体识别法是针对整个系统考虑的,而用例识别法则分别对每一个用例进行识别。因为,用例识别法可能会识别出使用实体识别没有识别出来的类。,针对每个用例,可通过回答以下问题来识别类:在用例描述中出现了哪些实体?或者用例的完成需要哪些实体的合作?用例在执行过程中会产生并存储了哪些信息?用例要求与之关联的角色应该向该用例输入什么信息?用例向与之关联的角色输出什么信息?用例需要对哪些硬设备进行操作?,4.6.4 利用分解和抽象技术,1.分解技术 分解技术是指对整体类和组合类进行分解的技术。通过分析,对已标识出来的“大类”进行分解,得

50、到新的类,可以控制单个类的规模。在使用分解技术时一定要注意,分解出来的类一定要是系统所需要的相关类,否则分解就是没有意义的。,2.抽象技术 在所识别的类中,可能存在一些具有相似性的类所谓相似性是指在信息和动作上的相似性。根据这些类的相似性建立抽象类,并建立抽象类与这些类之间的继承关系。抽象类实现了系统内部的重用,很好地控制了复杂性,并为所有子类定义了一个公共的界面,使设计局部化,提高了系统的可修改性和可维护性。使用抽象类技术也要注意,当两个类之间的相似性不强时,要慎重考虑是否需要建立抽象类。,一般来说,在UML中绘制类图的主要步骤如下:(1)创建类图;(2)研究分析问题领域确定系统需求;(3)

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号