为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

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

2021-02-19 175页 ppt 4MB 25阅读

用户头像 机构认证

爱赢

公司经营范围:网络软件设计、制作、图文设计、影视制作(编辑)

举报
uml 基础教程 第四章-类图和对象图第四章类图和对象图第四章类图和对象图本章导读知道类图和对象图的表示方法掌握类的属性、操作和关系了解类的识别方法4.1类图的定义 类图指的是对系统中的各种概念进行建模并描绘出它们之间关系的图。它描述了系统的静态结构。  类图通过系统中的类以及各个类之间的关系来描述系统的静态方面。在类图中,一共包含以下几种模型元素,即类(Class)、接口(Interface)、依赖(Dependency)关系、泛化(Generalization)关系、关联(Association)关系以及实现(Realization)关系。由于静态视图主要用于...
uml 基础教程 第四章-类图和对象图
第四章类图和对象图第四章类图和对象图本章导读知道类图和对象图的表示方法掌握类的属性、操作和关系了解类的识别方法4.1类图的定义 类图指的是对系统中的各种概念进行建模并描绘出它们之间关系的图。它描述了系统的静态结构。  类图通过系统中的类以及各个类之间的关系来描述系统的静态方面。在类图中,一共包含以下几种模型元素,即类(Class)、接口(Interface)、依赖(Dependency)关系、泛化(Generalization)关系、关联(Association)关系以及实现(Realization)关系。由于静态视图主要用于支持系统的功能性需求,也就是系统提供给最终用户的服务,而类图的作用是对系统的静态视图进行建模。当对系统的静态视图进行建模时,通常用以下3种方式来使用类图:(1)模型化简单的协作(2)模型化逻辑数据库模式(3)为系统的词汇建模4.2类的构成类是面向对象系统组织结构的核心。类是对一组具有相同属性、操作、关系和语义的对象的描述,类之间共享属性与服务的机制即为继承。在UML图形表示中,类的表示法是一个矩形,分别是类的名称(Name)、类的属性(Attribute)和类的操作(Operation)。类的名称位于矩形的顶端,类的属性位于矩形的中间部位,而矩形的底部显示类的操作。中间部位不仅显示类的属性,还可以显示属性的类型以及属性的初始化值等。矩形底部也可以显示操作的参数表和返回类型等。4.2.1名称类名称是每个类的图形中所必须拥有的元素,用于同其他类进行区分。类的名称通常是来自于系统的问题域,并且尽可能地明确表达要描述的事物,不会造成类的语义冲突。类的名称是一个名词,且不应该有前缀或后缀。在UML中一个矩形表示一个类的图标,按照UML约定,类的名称的首字母应当大写,放在矩形的偏上部。如果类的名称由两个单词组成,那么将这两个单词合并,第二个单词首字母也大写(如WashingMachine)。如图4-4。类在它的包含者内有唯一的名称,这个包含者通常可能是一个包,但也可能是另外一个类。在类中,默认显示包含该类所在的名称。如图4-5。如果WashingMachine(洗衣机)类是Househould(家用品)包的一部分,那么这个类的名字为:Househould::WashingMachine。包名在左,类名在右,中间用双冒号隔开。这种类型的类名叫路径名(pathname)。操作指的是类所能做的事情,或者另一个类能对类做的事情。类的操作可以根据不同的可见性由其他任何对象请求以影响其行为。属性是描述类的对象特性的值,而操作用于操纵属性的值进行改变或执行其他动作。操作有时被称为函数或方法,在类的图形表示中它们位于类的底部。一个类可以有零个或多个操作,并且每个操作只能应用于该类的对象。4.2.2操作 操作由一个返回类型、一个名称以及参数来描述。其中,返回类型。名称和参数一起被称为操作签名。操作签名描述了使用该操作所必需的所有信息。操作的语法表示为:[可见性]操作名称[(参数表)][:返回类型][{属性字符串}]   如表4-11.可见性描述了该操作是否对于其他类可见,从而是否可以被其他类引用。类中的可见性操作有3种,分别是公有类型(public)、受保护类型(protected)和私有类型(private)。在Rational中还添加了实现(Implementation)选项。如表4-22.操作名称类的每个操作都必须有一个名称以区别于类中的其他操作。通常情况下,操作名由描述所属类的行为的动词或动词短语构成。和属性的命名一样,操作名称的第一个字母小写,如果操作名称包含多个单词,那么单词需要进行合并,并且除了第一个英文单词外其余单词的首字母要大写。操作名列表放在属性名列表之下,两者之间用分隔线隔开,如图所示:WashingMachinebrandNamemodelNameserialNumbercapacityaddClothes()removeClothes()addClothes()turnOn()3.返回类型 返回类型指定了由操作返回的数据类型。它可以是任意有效的数据类型,返回类型至多一个。如果操作没有返回值,在具体编程语言中一般要加上一个关键字void来表示,也就是其返回类型必须是void。4.属性字符串 用来附加一些关于操作的除了预定义元素之外的信息,方便对操作的一些内容进行说明。5.参数表还可以为操作指定附加信息,在操作名后面的括号中可以说明操作所需要的参数和参数的类型。有一种操作叫函数,它在完成操作后要返回一个返回值,可以指明函数的返回值及返回值的类型。参数表由类型、符对组成的序列,实际是操作或方法被调用时接收传递过来的参数值的变量。参数的定义方式为: 名称:类型如果存在多个参数,则将各个参数用逗号隔开。如果方法没有参数,则参数表就是空的。参数可以具有默认值。上述全部的操作信息被称为操作的型构(signature)。如下图:WashingMachinebrandNamemodelNameserialNumbercapacityaddClothes(C:String)removeClothes(C:String)addClothes(D:Integer)turnOn():Boolean属性描述了在软件系统中所代表的对象具备的静态部分的公共特征抽象,这些特征是这些对象所共有的。属性是类的一个特性,它描述了类的对象(也就是类的实例)所具有的一系列特性值。一个类可以具有零个或多个属性在UML中,类的属性的表示语法为:[可见性]属性名称[:属性类型][=初始值][{属性字符串}]如表4-3所示4.2.3属性1.可见性属性的可见性描述了该属性是否对于其他类可见,从而确定是否可以被其他类引用。类中属性的可见性和类的操作的可见性一样,也有3种。分别是公有类型(public)、受保护类型(protected)和私有类型(private)。在Rational中还添加了实现(Implementation)选项。2.属性名称属性是类的一部分,每个属性都必须有一个名字以区别于类中的其他属性。通常情况下,属性名由描述所属类的特性的名词或名词短语构成。   按UML约定,单字属性名小写,如果属性名包含了多个字,要合并这些单词,并且除了第一个英文单词外其余但系的首字母要大写。属性名列表放在类名之下,并且和类名之间用分隔线隔开。3.属性字符串用来指定关于属性的一些附加信息,如某个属性应该在某个区域是有限制的。任何希望添加在属性定义字符串中但又没有合适地方可以加入的规则,都可放在属性字符串中。4.初始值在程序语言中,设定初始值通常有两个用处:首先,用来保护系统的完整性。例如,在编程中,为了防止漏掉对类中某个属性的取值,或者防止类的属性在自动取值的时候会破坏系统的完整性,可以通过赋初始值的方法保护系统的完整性;其次,为用户提供易用性。设定一些初始值能够有效帮助用户进行输入,从而能够为用户提供很好的易用性。类的属性在该类对象中都有具体值,如下图:myWasher:WashingMachinebrandName=“Laundatorium”‘modelName=“Washmeister”serialNumber=“GL57774”Capacity=165.属性类型用来指出该属性的数据类型。典型的属性的类型包括Boolean、Integer、Byte、Date、String和Long等。当一个类的属性被完整定义后,它的任何一个对象的状态都由这些属性的特定值所决定。属性可以带类型和缺省值,如下图:WashingMachinebrandName:Sting=“Laundatorium”modelNam:StringserialNumber:StringCapacity:Integer4.2.4注释使用注释可以为类添加更多的描述信息,也是为类提供更多的描述方式中的一种。如图4-6所示。通常对属性或者操作添加一个注释。下图的注释说明了serialNumber(序列号)属性引用了政府标准,根据这个注释就可以参考相关标准以查阅如何生成WashingMachine类对象的serialNumber属性值。WashingMachinebrandNamemodelNameserialNumbercapacityacceptClothes()acceptdDetergent()turnOn()turnOff()4.2.5约束类的约束指定了该类所要满足的一个或多个规则。在UML中,约束是用一个大括号括起来的文本信息。如图4-7。例如,你想指定WashingMachine类洗衣机的容量只能是16、18或者20磅(也就是对WashingMachine类的capacity属性施加约束),你可以在WashingMachine类图标的旁边写一个约束“{capacity=16or18or20Ib}”,{capacity=16or18or20}WashingMachinebrandNamemodelNameserialNumbercapacityacceptClothes()acceptdDetergent()turnOn()turnOff()4.2.6职责类的职责指的是对该类的所有对象所具备的那些相同的属性和操作共同组成的功能或服务的抽象。  职责描述了类做什么——也就是类的属性和操作能完成什么任务。例如,一台洗衣机的职责是将脏衣服作为输入,输出洗干净的衣服。(Takedirtyclothesasinputandproducecleanclothesasoutput)。 类的属性和操作是对类的具体结构特征和行为特征的形式化描述,而职责是对类的功能和作用的非形式化描述。 有了属性、操作和职责,一个类的重要语义内容就基本定义完毕了。在声明类的职责的时候,可以非正式地在类图的下方增加一栏,将该类的职责逐条描述出来。类的职责其实只是一段或多段文本描述。WashingMachinebrandNamemodelNameserialNumbercapacityacceptClothes()acceptdDetergent()turnOn()turnOff()Takedirtyclothesasinputandproducecleanclothesasoutput4.3UML中不同的类在本节中需要掌握的内容有:如何对类之间的关系建模;如何可视化类和子类的关系;如何表现类之间的依赖。Class类型的类是我们说的普通类,还有两种比较常用的类型是ParameterizedClass、InstantiatedClass,分别代表参数化类和实例化类。1.实例化类(InstantiatedClass)实例化类具有实际变元值的参数化类。类的事物抽象,参数化类是更高一等的抽象,指明一群有类似属性和行为的类。通过参数的具体化,能产生出不同的类,这种具体化的类就是实例化类。2.参数化类(ParameterizedClass)参数化类通常用于创建一系列其他类。可以说,参数化类就是某种容器,所以也被称为模板类。模板类的是对一个参数化类的描述符。模板体可能包含代表模板本身的缺省元素,还包括形式参数。通过把参数绑定到实际值上就可以生成一个实际的类。模板类的属性和操作可以用形式参数来定义。在UML表示中,模板类的表示形式如图4-8所示。模板类不是一个直接可用的类。必须把它的参数绑定到实际的值上以生成实际的类。只有实际的类才可以作为关联的父亲或者目标(但是允许从模板到另一个类的单向关联)。4.4构造型1.实体类(Enity) 在实体类中保存需要放进永久存储体的信息。比如为数据库中的每一个表创建一个实体类,在数据表中永久存储信息,而实体类在系统运行时在内存中保存信息。如图4-9所示。2.控制类(Control)控制类用来负责协调其他类的工作,通常本身并不完成任何功能,其他类也不向其发送很多消息,而是由控制类以委托责任的形式向其他类发送消息。   控制类有权知道和执行机构的业务规则,并且可以执行其他流,知道在发生错误时如何对错误进行处理。如图4-10所示3.边界类(Boundary)边界类位于系统与外界的交界处,包括所有窗体、报表、打印机和扫描仪等硬件的接口以及与其他系统的接口。在UML中,边界类的表示如图4-11。4.5类之间的关系  类和类之间最常用的关系通常有4种,分别是依赖关系、泛化关系、关联关系和实现关系。如表4-4类之间的关系4.5.1泛化关系(继承)泛化关系用来描述类的一般和具体之间的关系。具体描述建立在对类的一般描述的基础之上,并对其进行了扩展 泛化关系使用从子类指向父类的一个带有实线的箭头来进行表示,指向父类的箭头是一个空三角形,每一个分支指向一个子类。在泛化关系中,一般描述的类被称为父类,具体描述的类被称为子类。泛化关系空心三角形箭头的实线,子类指向父类。代码中通常有extends关键字(Java)。完全泛化泛化关系描述的是“isakindof”(是。。。。的一种)的关系,它使父类能够与更加具体的子类连接在一起,有利于对类的简化描述,可以不用添加多余的属性和操作信息,通过相关继承的机制从其父类继承相关的属性和操作子类除了继承父类的属性和操作外,通常也增加了自己的属性和操作。  一个类可能没有父类,这种没有父类的类被称为基类(baseclass)或根类(rootclass);一个类也可以没有子类,没有子类的类被称为叶类(leafclass)。如果一个类恰好只有一个父类,这样的继承关系叫做单继承(singleinheritance)。如果一个类有多个父类,这样的继承就是多继承(multipleinheritance)。泛化关系具有3个重要的作用。(1)用来定义可代替性原则即当一个变量被声明承载某个给定类的值时,可使用类的实例作为值,这被称为可替代性原则。该原则表明声明了祖先,则后代的一个实例就可以被使用(2)使得多态操作称为可能,即操作的实现是由它们所使用的对象的类,而不是由调用者确定的。   这是因为一个父类可以有许多子类,每个子类都可实现定义在类整体几种的同一操作的不同变体。(3)在共享祖先所定义的成分的前提下允许它自身定义增加的描述,这被称为继承。继承是一种机制,通过该机制可以将对类的对象的描述从类及其祖先的声明部分聚集起来。继承允许描述的共享部分只被声明一次便可以被许多类所共享,而不是在每个类中重复声明并使用它,这种共享机制减小了模型的规模。两个类之间具有继承关系。例如人和学生,学生继承了人,除过具有人的一般的属性和方法之外,他还要有学习的方法。对应的UML图如下所示泛化用空心三角形+实线表示。下图表示Student继承PeopleStudent继承自People,并且多了一个study的方法。classPeople{protectedStringname;protectedStringsex;protectedDatebirthday;publicvoideat(){System.out.println(name+"正在吃饭......");}publicvoiddrink(){System.out.println(name+"正在喝水......");}publicvoidsleep(){System.out.println(name+"正在休息......");}}classStudentextendsPeople{publicvoidstudy(){System.out.println(name+"正在学习......");}}4.5.2实现关系 在UML中,有一个专门的建模元素可以用于对类或部件所提供的服务进行描述,这就是接口(Interface)。UML接口描述的是一系列的方法,这些方法为一个类或部件规定了其必须提供的服务。(6)接口支持多继承,而抽象类仅仅支持单继承接口被建模为实现(Realization)关系。实现关系将一种模型元素(如类)与另一模型元素(如接口)连接起来,从而说明和其他实现之间的关系。由实现关系指定二者之间的一个(Contract),一个模型元素定义一个合同,而另一个模型元素保证履行该合同。也就是说,关系中的一个模型元素只具有行为的定义,而行为的具体实现规则是由另一个模型元素来给出的。   在实现关系中,抽象类或接口只是行为的说明而不是结构或者实现,而类中则要包含其具体的实现内容,可以通过一个或多个类实现一个抽象类或接口,但每个类必须分别实现抽象类或接口中的操作。在UML中,实现关系使用一条带封闭空箭头的虚线来表示,如图4-15。接口可以使用一个圆圈来表示,并通过一条实线附在表示类的矩形上来表示实线关系,如图4-16所示。接口只是行为定义而不是结构或实现,接口中的属性都是常量,方法都是抽象方法。接口只是与外界接触时输入、输出格式的定义。接口只是一个口,它的里面是空的  泛化和实线关系都可以将一般描述与具体描述联系起来。泛化将在同一语义层上的元素连接起来(如在同一抽象层),并且通常在同一模型内。  实线关系将在不同语义层内的元素连接起来,并且通常建立在不同的模型内。在不同发展阶段可能有两个或更多的类等级,这些类等级的元素通过实线关系联系起来。空心三角形箭头的虚线,实现类指向接口。代码中通常有implements关键字(Java)。类CarDriver和PlaneDriver都实现了Driver接口代码publicinterfaceDriver{voiddrive();}classCarDriverimplementsDriver{publicvoiddrive(){System.out.println("驾驶汽车......");}}classPlaneDriverimplementsDriver{publicvoiddrive(){System.out.println("驾驶飞机......");}}4.5.3依赖关系依赖(Dependency)是两个事物间的语义关系,其中一个事物(称为服务的提供者)发生变化,会影响到另一个事物(称为客户或服务的使用者),或向它(客户)提供所需信息。在类与类之间应用依赖关系指明一个类使用另一个类的方法或一个类使用其它类所定义的属性和方法。依赖表示的是两个或多个模型元素之间语义上的连接关系。它只将模型元素本身连接起来,而不需要用一组实例来表达它的意思。最通常的依赖关系是一个类操作的型构中用到另一个类的定义。它表示了这样一种情形,提供者的某些变化会要求或指示依赖关系中客户的变化。也就是说依赖关系将行为和实现与影响其他类的类联系起来。 依赖关系还经常用来具体实现间的关系,如代码层的实现关系。在概括模型的组织单元(如包)时,依赖关系很有用,它在其上显示了系统的架构,如编译方面的约束可通过依赖关系来表示。依赖关系使用一个虚箭头来表示,并且使用一个构造型的关键字位于虚箭头之上来区分依赖关系的种类。依赖表示类之间的调用(使用)关系,通常是类A中的方法需要类B的实例作为其参数或者变量,而类A本身并不需要引用类B的实例作为其成员变量或者说属性(这个和关联不一样)。虚线+箭头,类A指向类B依赖是一种使用关系,它表示了一个事物说明的变化可能影响到使用它的另一个事物,但反之未必。也就是说,服务的使用者以某种方式依赖于服务的提供者。而关联是一种结构关系,它详述了一个事物的对象与另一个事物的对象的相互联系例子自行车和打气筒,自行车通过打气筒来充气,那么就需要调用打气筒的充气方法。对应的UML图如下所示:打气筒并不属于某个特定的自行车,一个打气筒可以为多个自行车提供充气的服务。在Bicycle中不需要定义Pump类型的属性,而是将传递了一个Pump类型的参数到Bicycle的方法中。例子代码classBicycle{publicvoidexpand(Pumppump){pump.blow();}}classPump{publicvoidblow(){System.out.println("正在充气......");}}依赖(Dependency)总结【依赖关系】:是一种使用的关系,即一个类的实现需要另一个类的协助,所以要尽量不使用双向的互相依赖.【代码表现】:局部变量、方法的参数或者对静态方法的调用【箭头及指向】:带箭头的虚线,指向被使用者4.5.4关联关系关联(Association)表示一个对象拥有另一个对象。当类之间在概念上有连接关系时,类之间的连接叫做关联(association)。篮球比赛的初步模型中提供了这样的例子让我们来研究其中的一个关联——队员和球队之间的关联。可以用一个短语“队员为篮球队效力(“Playon”)来刻画这个关联。关联的可视化表示方法是用一条线连接两个类,并把关联的名字(例如“Playon”)放在这个连接线之上。关联的方向用一个实心三角形箭头来指明。通常是类A中需要引用另一个类B的实例作为成员变量,表示类A需要“知道”类B。实线箭头,类A指向类B。(一)关联名为了方便人们的阅读,关联通常有一个名称,这个名称应该选用一个动词词组。关联可以有名称,用来描述关联的性质和作用。关联关系通常是在分析过程中命名的,此时还没有足够的信息对角色进行适当的命名。如果使用关联关系名称,关联关系名称就应该反映该关系的目的,关联关系名称应放置在关联关系路径上或其附近,并且用一个实心箭头表示关联名称的发生分那个上。(二)关联的角色当一个类和另一个类发生关联时,每个类通常在关联中都扮演着某种角色。角色是关联关系中一个类对另一个类所表现出来的职责。可以在图中靠近每个类的地方的关联线上标明每个类的角色。每个角色都必须有名称,而且对应一个类中所有角色的名称都必须是唯一的。角色名称应该是一个名词,以描述在特定的环境中关联的行为或职责。关联角色是对一个关联的特殊说明,关联角色的命名应该能够表达被关联关系对象的角色与关联关系对象之间的关系。(三)多重性多重性表示一个类同时拥有的实例的数目,它描述的是一个类的多少对象与另一个类的一个对象相关,可用一个单一的数字或一个数字序列表示。多重性应放在被拥有的类的附近。   在UML中,多重性是使用“..”分开的两个数值区间来表示的,其格式为“minimum..maximum”,其中minimum和maximum都是整数。当一个端点给出多少赋值时,就表示该端点可以有多个对象与另一端点的一个对象进行关联。若类A和类B之间有关联关系,多重性定义了类A有多少个实例可以和类B的一个实例关联。常用的多重性表达方式如表:说明:UML中用*表示不确切的最大数,Rose中用n表示。多重性表示语义多重性表示语义*0到多个1..*1到多个n0到多个5..155到15个0..*0到多个3只能是30..n0到多个1,3,81或3或8(枚举型)0..10或1个多重性的值表示在特定时刻(而不是在某个时间跨度内)有效关联的实例数量。例如,一个Person可能在某段时间内被多个Company雇佣,但是在某一时刻这个Person只能被一个Company雇佣,表示为1;而在某一时刻这个Company可以雇佣0到多个Person,表示为0..n。多重性实际上是一种约束。(四)导航性关联关系加上导航箭头,由源对象指向目标对象,表明在运行时刻从源类的一个对象可以找到目标类的一个或多个对象(取决于关联端的多重性)。多重性放置在目标一端,而不是源端。只在一个方向上有导航性箭头的关联称为单向关联;在两个方向上都可以导航的是双向关联,用一条没有箭头的实线表示,等价于两端都有箭头。(五)关联类如果一个关联既是类又是关联,那么它是一个关联类。关联类是一种具有关联特征和类特征的建模元素,可以把它看成是具有类特征的关联或具有关联特征的类。关联类的可视化表示方式与一般的类相同,但是要用一条虚线把关联类和对应的关联线连接起来。如图4-19所示。(六)关联的约束两个关联之间有一条虚线,上面写着{xor}。在UML中,这种以大括号括起来的,放在建模元素外面的字符串就是约束。约束可以是自由文本。在关联上加上约束,可以加强关联的含义。(七)限定关联当关联的多重性是一对多时,就产生了一个特殊问题:查找问题。当一个类的对象必须要选择规则中另一类的特定对象来满足关联中的角色时,第一个类必须要依赖一个具体的属性值来找到正确的对象。这个属性值通常是一个标识符号,例如一个ID号。存在限定符(Qualifier)的关联称为限定关联(QualifiedAssociation),限定关联用于多重性为一对多或多对多的关联。限定符画成一个内标限制内容的小方块,链接在它所限定的类上。数组非常典型地可以被建模为一个受限定的关联。数组是受限定对象,数组下标是限定符,而数组元素就是目标对象。引入限定符的一个目的是把多重性从n将为1或0..1,这样如果做查询操作,那么返回的对象最多是一个,而不是一个对象集。如果查询操作的结果是单个对象,则这个查询操作的效率比较高。(八)派生属性和派生关联是指可以从其他属性和关联计算推演得到的属性和关联。派生用图标“/”表示。(九)关联的种类一个关联可以有两个或多个关联端,每个关联端连接到一个类。而根据关联所连接类的数量,类之间的关联可以分为3种关联:自身关联、二元关联和N元关联(多元关联)。1、自身关联有时一个类可能与它角色自己发生关联,这样的关联被称为自身关联(reflexiveassociation)。当一个类的对象可以充当多种角色时,自身关联就可能发生。2、二元关联最普通的关联是一对类之间的二元关联,即在两个类之间的关联。二元关联使用一条连接两个类的连线表示,连线上有相互关联的角色名而多重性则加在各个端点上。3、N元关联指在3个或3个以上类之间的关联。N元关联中多重性的意义是:在其他N-1个实例值确定的情况下,关联实例元组的个数。例子关联是指两个类之间存在某种特定的对应关系,例如客户和订单,一个订单只能属于某个客户,一个客户可能会有多张订单。根据方向,分为单向和双向。根据对应的数量分为一对一、一对多、多对多等。关联关系用实线+箭头表示。下图显示Customer和Order是双向一对多关联关系。那么在Customer中应该有Order的集合,在Order中应该Customer的属性。例子-代码classCustomer{privateIntegerid;privateStringname;privateSetorders;publicSetgetOrders(){returnorders;}publicvoidsetOrders(Setorders){this.orders=orders;}}classOrder{privateIntegerid;privatefloatmoney;privateCustomercustomer;publicCustomergetCustomer(){returncustomer;}publicvoidsetCustomer(Customercustomer){this.customer=customer;}}关联(Association)总结【关联关系】:是一种拥有的关系,它使一个类知道另一个类的属性和方法;如:老师与学生,丈夫与妻子关联可以是双向的,也可以是单向的。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。【代码体现】:成员变量【箭头及指向】:带普通箭头的实心线,指向被拥有者4.5.5特殊关联——聚合和组合1、组合关系组合也表示整体与部分的关系,它是聚合关系中的一种特殊情况,是更强形式的聚合,在整体中拥有管理部分的特有的职责,有时也被称为强聚合关系。   在组合中,部分与整体具有相同的生命周期,“部分”对象完全依赖于“整体”对象。这种依赖性表现在两个方面:第一,部分对象一次只能属于一个组合对象;第二,当组合对象销毁时,它的所有从属部分都必须同时销毁。在UML中,组成关系使用带实心菱形头的实线来表示,其中头部指向整体。通常需要在实例化类A的同时在其构造方法之中实例化类B,使类B作为类A的一部分,表示一个强的“拥有”关系,即类B是类A的一部分,二者共生命周期,具有严格的“整体—部分”关系。尾部为实心菱形的实现箭头,类A指向类B。例子组合和聚集中的类都是整体与部分的关系,与聚集不同的而是,其中的类不能对立出来。例如一个人由头、手、腿和躯干等组成,如果这个头离开了这个人,那么这个头就没有任何意义了。下图表示People是由Head、Hand、Leg等组成,People和Head、Hand、Leg是不可分割的,Head、Hand、Leg离开了People没有任何实际意义。在People中定义了Head、Hand、Leg类型的属性,组合也可以看成是聚合的一种特殊形式。代码classPeople{privateHeadhead;privateHandhand;privateLegleg;publicvoidthink(){head.think();}publicvoidholdThing(){hand.holdThing();}publicvoidwalk(){leg.walk();}}classHead{publicvoidthink(){System.out.println("思考......");}}classHand{publicvoidholdThing(){System.out.println("拿东西......");}}classLeg{publicvoidwalk(){System.out.println("走路......");}}组合(Composition)总结【组合关系】:是整体与部分的关系,但部分不能离开整体而单独存在.如公司和部门是整体和部分的关系,没有公司就不存在部门.组合关系是关联关系的一种,是比聚合关系还要强的关系,它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期【代码体现】:成员变量【箭头及指向】:带实心菱形的实线,菱形指向整体2、聚集(聚合)关系   一个类有时是由几个部分类组成的。这种特殊类型的关系被称为聚集(aggregation)。部分类和由它们组成的类之间是一种整体—部分(part---whole)关联。   聚集关系描述的是部分与整体关系的关联,即它将一组元素通过关联组成一个更大、更复杂的单元,这种关联关系就是聚集。聚集关系的含义是“聚”在一起,也就是表示“部分”可以独立于“整体”而存在。在UML中,它用端点带有空菱形的线段来进行表示,空菱形与聚集类相连接,其中头部指向整体。通常是类A中需要包含另一个类B的实例或实例的集合,表示一种弱的“拥有”关系,即类A包含类B,但类B不是类A的一部分,而是一个独立存在的类。尾部为空心菱形的实线箭头(空心菱形+实线表示),类A指向类B。例子聚合是整体与部分之间的关系。例如计算机和主板,计算机是一个整体,主板是其中的一部分,主板、显卡、显示器等部件组成了计算机。对应的UML图如下所示:计算机由主板、显卡等部件组成,所以在Computer中定义了MainBoard和DisplayCard类型的属性。聚合中类之间可以独立出来,比如一块主板可以装在A计算机上,也可以装在B计算机上。也就是说这块主板离开A计算机之后仍然是有意义的。代码classComputer{privateMainBoardmainBoard;privateDisplayCarddisplayCard;publicvoidon(){System.out.println("开启计算机......");}publicvoidclose(){System.out.println("关闭计算机......");}publicvoidrun(){System.out.println("计算机正在运行......");}}classMainBoard{publicvoidcontrol(){System.out.println("控制计算机......");}}classDisplayCard{publicvoiddisplay(){System.out.println("计算显示数据......");}}聚合(Aggregation)总结【聚合关系】:是整体与部分的关系,且部分可以离开整体而单独存在.如车和轮胎是整体和部分的关系,轮胎离开车仍然可以存在.聚合关系是关联关系的一种,是强的关联关系;关联和聚合在语法上无法区分,必须考察具体的逻辑关系。【代码体现】:成员变量【箭头及指向】:带空心菱形的实心线,菱形指向整体3、何时使用聚合和组合聚合和组合是比较容易混淆的概念,实际应用中很难确定是用聚合还是组合关系。因而在设计时,采用聚合还是组合,要根据应用场景判断部分类和整体类之间的关系。聚合和组合的代码几乎相同,单凭代码是无法区分两个类之间是聚合还是组合的关系的。所以就需要结合实际的业务环境来区分。例如汽车和轮胎,车主买了一辆汽车,上边肯定是由轮胎的,在这个业务中,轮胎和汽车是组合关系,它们分开就没有实际意义了。在汽车修理店,汽车可以更换轮胎,所以在汽修店的业务环境中,汽车和轮胎就是聚合的关系,轮胎离开汽车是有业务意义的。各种关系各种关系的强弱顺序:泛化=实现>组合>聚合>关联>依赖下面这张UML图,比较形象地展示了各种类图关系:总结值得注意的是,关联、依赖、聚合、组合的关系很容易搞混。当对象A和对象B之间存在关联、依赖、聚合或者组合关系时,对象A都有可能调用对象B的方法。这是它们的相同之处。另外它们还有自己的特征。对于两个相对独立的对象A和B,当一个对象A的实例与B的实例存在固定的对应关系时,这两个对象之间为关联关系。代码中表现为在A中定义了B类型的属性。对于两个相对独立的对象A和B,当一个对象A负责构造对象B的实例,或者调用对象B提供的服务时,这两个对象之间主要体现为依赖关系。代码中的表现即将B类型的参数传入A的方法中,而不是在A中定义B类型的属性。聚合、组合与关联在代码中并没有明显的区别,主要看实际的业务环境,根据代码所处的实际业务环境来判断它们之间的关系。同样的两个类,处在不同的业务环境中,可能它们的关系也不相同。4.6类的识别类的识别是面向对象方法的一个难点,但又是建模的关键。在分析阶段,类的识别通常由分析人员在分析问题域的基础上完成。类的识别是面向对象方法的一个难点,但又是建模的关键。常用的方法有:名词识别法、实体识别法、用例识别法、CRC法等。4.6.1名词识别这种方法的关键是识别问题域中用到的名词或者名词短语来描述的实体,通过对系统简要描述进行分析,在提出实体对应名词的基础上识别类 名词识别法的步骤如下:(1)按照指定的语言对系统进行描述,描述过程应与领域专家共同合作完成,并遵循问题域中的概念和命名。(2)从系统中标识出名词、代词、名词短语,并以此标识为初始的类。(3)识别、确定类。并非所有列出的名词、代词、名词短语都是类,应根据一定的原则进行识别和确定。案例—银行网络ATM系统 一、问题的陈述  银行网络系统包括人工出纳和分行共享的自动出纳机;各分理处用自己的计算机处理业务(保存账户、处理事务等);各分理处与出纳站通过网络通信;出纳站录入账户和事务的数据;自动出纳机与分行计算机通信;自动出纳机与用户接口,接受现金卡;发放现金;打印收据;分行计算机与拨款分理处结账。  要求系统正确处理同一账户的并发访问;网络费用平均摊派给各分理处。根据下述原则进一步确定类:①去掉冗余类:如两个类表述同一信息,应保留最具有描述能力的类。②去掉不相干的类:删除与问题无关或关系不大的类③删除模糊的类:有些初始类边界定义不确切,或范围太广,应该删除。④删除那些性质独立性不强的,而应该是类“属性”的候选类。⑤所描述的操作不适宜作为对象类,并被其自身所操纵,所描述的只是实现过程中的暂时的对象,应删去。4.6.2实体识别这种方法和名词识别法很相似,但其关心的是构成系统的实体,而不关心系统的运作流程及实体间的通信状态、通常将实体识别法和名词识别法联合使用。被标识的实体通常有系统需要存储/分析/处理信息的实体、系统内部需要处理的设备、与系统交互的外部系统、系统相关人员、系统的组织实体等类型。系统中的信息实体,往往可以直接识别为类,如职工工资;系统需要处理的设备,可以命名一个同名的类来管理系统对该设备的操作,如一个传感器类;而将与本系统交互的外部系统看成一个黑盒子,不关心其内部细节,只关心本系统与外部系统的交互情况,可以将其抽象为类。例:有一个购物超市,顾客可在货架上自由挑选商品,由收款机收款,收款机读取商品上的条形码标签,并计算商品价格。收款机应保留所有交易的记录,以备账务复查、清理货存及汇总使用。4.6.3用例识别 用例图是对系统功能的描述,可以根据用例描述来识别类。该方法和实体识别法很相似,但实体识别法是针对整个系统考虑的,而用例识别法则分别对每一个用例进行识别。因为,用例识别法可能会识别出使用实体识别没有识别出来的类。   针对每个用例,可通过回答以下问题来识别类:①在用例描述中出现了哪些实体?或者用例的完成需要哪些实体的合作?②用例在执行过程中会产生并存储了哪些信息?③用例要求与之关联的角色应该向该用例输入什么信息?④用例向与之关联的角色输出什么信息?⑤用例需要对哪些硬设备进行操作?4.6.4利用分解和抽象技术1.分解技术分解技术是指对整体类和组合类进行分解的技术。通过分析,对已标识出来的“大类”进行分解,得到新的类,可以控制单个类的规模。在使用分解技术时一定要注意,分解出来的类一定要是系统所需要的相关类,否则分解就是没有意义的。2.抽象技术在所识别的类中,可能存在一些具有相似性的类所谓相似性是指在信息和动作上的相似性。 根据这些类的相似性建立抽象类,并建立抽象类与这些类之间的继承关系。抽象类实现了系统内部的重用,很好地控制了复杂性,并为所有子类定义了一个公共的界面,使设计局部化,提高了系统的可修改性和可维护性。  使用抽象类技术也要注意,当两个类之间的相似性不强时,要慎重考虑是否需要建立抽象类。一般来说,在UML中绘制类图的主要步骤如下:(1)创建类图;(2)研究分析问题领域确定系统需求;(3)根据用例图或者需求确定类及其关联,明确类的含义和职责,确定属性和操作。(4)添加类以及类的属性和操作;(5)添加类与类之间的关系。4.7对象图   对象图描述的是参与交互的各个对象在交互过程中某一时刻的状态。它是系统在某一个特定时间点上的静态结构,是类图的实例和快照,即类图中的各个类在某一时间点上的实例及其关系的静态写照  对象图所建立的对象模型描述的是某种特定的情况,而类图所建立的模型描述的是通用情况。类图与对象图的区别如下:类图对象图在类中包含三个部分,分别是类名、类的属性和类的操作对象包含两个部分:对象的名称和对象的属性类的名称只包含类名对象的名称栏包含对象名和类名类的属性栏定义了所有属性的特征对象的属性栏定义了属性的当前值类中列出了操作对象图中不包含操作内容,因为对属于同一个类的对象,其操作是相同的类中使用了关联连接,关联中使用名称、角色以及约束等特征定义对象使用链进行连接,链中包含名称、角色类是对象的抽象,类不存在多重性对象可以具有多重性4.7.1对象的表示   对象图是由对象(Object)和链(Link)组成的。对象图的目的在于描述系统中参与交互的各个对象在某一时刻是如何进行的。   对象是类的实例,创建一个对象时通常可从两种情况来观察:第一种情况是将对象作为一个实体,它在某个时刻有明确的值;另一种情况是作为一个身份持有者,不同时刻有不同的值。   由于对象是类的实例。对象的表示符号是与类相同的几何符号作为描述符,但对象使用带有下划线的实例名将它作为个体区分开来。顶部显示对象名和类名,并以下划线标识,使用的语法是“对象名:类名”,底部包含属性名和值的列表。   对象也有其他一些特殊的形式,如多对象和主动对象。多对象表示多个对象的类元角色。多对象通常位于关联关系的“多”端,表明操作或信号是应用在一个对象集而不是单个对象上的。4.7.2链的表示链是两个或多个对象之间的独立连接,是关联的实例通过链可以将多个对象连接起来,形成一个有序列表,称为元组。   对象必须是关联中相应位置处类的直接或间接实例。一个关联不能有来自同一关联的迭代连接,即两个相同的对象引用元组。 链可以用于导航,连接一端的对象可以得到另一端的对象,也就可以发送消息。如果连接对目标方向有导航性,这一过程就是有效的。如果连接是不可导航的,访问可能有效或无效,但消息发送通常是无效的,相反方向的导航另外定义。  在UML中,链的表示形式为一个或多个相连的线或圆弧。在自身相关联的类中,链是两端指向同一对象的回路如图4-23所示。对象图例子总结:类图的应用和抽象层次在软件开发的不同阶段都使用类图,但这些类图表示了不同层次的抽象:在需求分析阶段,类图是研究领域的概念;在设计阶段,类图描述类与类之间的接口;在实现阶段,类图描述软件系统中类的实现。类图分为三个层次: 1.概念层(Conceptual)类图描述应用领域中的概念。 2.说明层(Specification)类图描述软件的接口部分,而不是软件的实现部分。3.只有在实现层(Implementation)才真正有类的概念,并且揭示软件的实现部分。上述三个层次分别对应于领域模型、分析模型和设计模型。   类图应用于软件系统建模时,主要用来构建领域模型、分析模型和设计模型。这3个模型不是孤立的,而是相互联系进化发展的。1、领域模型   领域模型中的类图描述的是现实世界中问题域的概念理解,所以是概念层类图。   因此在构建这个模型的时候,最主要的工作就是找出相关的类,然后明确类之间的关联关系,必要时加入一些多重性描述和业务约束规则。   相关元素:   (1)类的主要职责   (2)类间关系   (3)重要的多重性关系   (4)部分业务规则性约束   需要注意的是,概念层类图中的类和类的关系与最终的实现类不一定有直接和明显的对应关系。绘制概念层类图时,很少考虑或不考虑实现问题,它应独立于具体的程序设计语言和实现方式。2、分析模型      分析阶段的类图中表达的类和类的关系应当是对问题领域在接口层次抽象的描述,所以是说明层类图。   在面向对象软件开发方法中,分析模型中有3种有用的构造型,即边界类、控制类和实体类。分析模型通常是在用例模型和领域模型的基础上进行综合分析而得到的,从领域模型中将得到实体类,而边界类主要负责处理与用户的交互,控制类负责完成实际的程序逻辑。   相关元素:   (1)边界/控制/实体类   (2)从系统实现角度整理   (3)进一步细化类的职责   (4)进一步细化类的关系   (5)进一步细化业务规则   说明层类图描述软件的接口部分,而不是软件的实现部分。因为这个接口可能因为实现环境、运行特征或开发商的不同而有多种不同的实现。这个阶段,类图是以分析类和分析模型图来表示。3、设计模型设计模型中类图描述软件系统中类的实现,提供类的实现细节,所以是实现层类图。与分析模型相比,设计模型中类的属性集更趋完善;更重要的是它将加入抽象类、接口等其他设计元素,以及框架类的使用,设计模式的使用等。   实现层类图中的类可直接映射到可执行代码。在这个层次上,类必须明确采用哪种实现语言,什么设计模式、什么通信标准、遵循什么等。      相关元素:   (1)用构造型细化类间关系   (2)模板/主动/关联/嵌套关系   (3)引用对象、值对象   (4)抽象类与接口、OCL   (5)设计类(框架与设计模式)绘制类图不要过早地陷于实现细节,应根据项目开发的不同阶段,采用不同层次的类图。如果处于分析阶段,应该画概念层类图;当开始着手软件设计时,应画说明层类图;当考察某个特定实现技术时,则应该画实现层类图。如何从用例图过渡到类图例图过渡到类图:用例图可以表示系统要完成的功能,要干哪些事情;类图表示系统有哪些类,哪些方法,从类图可以了解系统的结构和组成,确定用例图比较简单,比如一个系统的登录就是可以看作一个用例。管理员输入用户密码登录系统。那根据这个用例如何确定有哪些类呢?第一种,从三层架构的角度出发,每层对应该操作的一个类,DAL层对应着数据库操作相关的方法,BLL层对应着逻辑相关的方法,U层对应着数据的输入与输出,另外需要实体类在各层之间传输数据,起到了封装参数的作用。图可以这样画:第二种,从面对对象的角度分析:类是对象的抽象,对象代表的是现实世界的实体,这登录这个用例中,用户输入用户名密码登录系统,用户是对象,有用户名、密码的属性,因此可以确定一个用户类,把登录方法也放到用户类中,类图可以这样画简答题:1、如何用UML表示类?2、类图标中可以指明哪些信息?3、为什么要对类图标附加注释?4、多重性怎么表示?5、如何发现类之间的继承关系?6、聚集和组成有什么区别?7、什么叫实现?实现和继承有何相似之处?两者又有何不同之处?#练习题#1:油画类到图画类的关联,用限定关联表示两者之间关系,可用ID号来限定。扮演保险客户角色的“人”可以有0至多个保险合同,每个保险合同都与一家保险公司有关,保险公司扮演着承保者的角色。顾客和保险合同通过0或1个保险单建立三元关联关系。练习题2:窗口由文本框、列表框、按钮和菜单组成。关联的重数表示,人可以拥有零到多辆小汽车,小汽车可被1至多个人拥有。练习题3:在显示器屏幕上圆心坐标为(100,100)的位置画一个半径为40的圆在,在圆心坐标为(400,150)的位置画一个弧,弧的角度为30度,结束角度为120度,半径为50用类图表示圆类和弧类的关系。UML中定义了类的3种十分有用的构造型,即边界类、控制类和实体类。引入这些概念有助于分析和确定系统中的类。1、边界类边界类位于系统与外界的交界处,通常是用来完成参与者与系统之间交互的类,如窗体Form、对话框、菜单、报表以及表示通信协议的类等。通过用例图可以确定需要的边界类,每个参与者/用例至少有一个边界类,但并非每个参与者/用例都要生成唯一边界类,多个参与者/用例可以启动同一个边界类与系统通信。2、控制类控制类是对控制对象的抽象,主要用来体现应用程序的执行逻辑,将其抽象出来,可以使变化不影响用户界面和数据库中的标。每个用例通常有一个控制类,用于控制用例中的事件顺序,控制类可以在多个用例间共用。其他类并不向控制类发送很多消息,而是由控制来发送出很多消息。3、实体类   实体类是实体对象的抽象,通常来自领域模型也就是现实世界,用来描述具体的实体,通常映射到数据库表格与文件中。或者说实体类保存要放进持久存储体的信息,持久存储体就是数据库、文件等介质。   实体类一般可以通过事件流和交互图发现,并且通常以领域术语命名。   一般来说,每个实体类在数据库有相应的表,实体类中的属性对应数据库中表的字段。但这并不说明实体类和数据库中的表就是一一对应的。有可能一个实体类对应多个表,或者多个实体类对应一个表。构造类图的实用方法1、利用名词/动词法 在绘制类图时,第一步就是发现类,最常用的方法是“名词动词法”,其主要规则是从名词与名词短语中提取对象与属性;从动词与动词短语中提取操作与关联;而所有格短语通常表明名词应该是属性而不是对象。构造类图的实用方法2、用例图法在需求分析阶段根据用例描述中的名词确定类的候选者,并进行分析确定类。结合名词/动词法,从名词与名词短语中提取对象和属性;从动词和动词短语中提取操作与关联,而所有格短语通常表明名词应该是属性而不是对象。构造类图的实用方法3、使用CRC分析法寻找类   CRC是类(Class)、职责(Responsibility)和协作(Collaboration)的简称,CRC分析法根据类所要扮演的职责来确定类。构造类图的实用方法4、根据边界类、控制类和实体类的划分,可利用顺序图来帮助发现系统中的类。请对系统需求进行分析!实例一医院病房监护系统监视病情更新病历简单的需求分析说明  对“医院病房监护系统”进行分析,确定系统的主要功能如下:  1.病症监视器可以将采集到的病症信号(组合),格式化后实时的传送到中央监护系统。  2.中央监护系统将病人的病症信号分解后与标准的病症信号库里的病症信号
/
本文档为【uml 基础教程 第四章-类图和对象图】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索