《类图由类及类与类之间的关系组成常有关联泛化继承.ppt》由会员分享,可在线阅读,更多相关《类图由类及类与类之间的关系组成常有关联泛化继承.ppt(47页珍藏版)》请在三一文库上搜索。
1、类图由类及类与类之间的关系组成。常有关联、泛化(继承)、依赖和细化等4种关系。 1. 关联(relating) 关联表示两个类的对象之间存在某种语义上的联系。 (1) 普通关联(common relating) 只要在类与类之间存在连接关系就可以用普通关联表示。关联是双向的,可在一个方向上为关联起一个名字,在另一个方向上起另一个名字(也可不起名字)。为避免混淆,在名字前面(或后面)加一个表示关联方向的黑三角。,9.4.2 表示关系的符号(Relationship Symbol),图9.6 普通关联示例,在表示关联的直线两端可以写上重数(multiplicity),它表示该类有多少个对象与对方的
2、一个对象连接。重数的表示方法通常有: 01 表示0到1个对象 0*或* 表示0到多个对象 1+或1* 表示1到多个对象 115 表示1到15个对象 3 表示3个对象 如果图中未明确标出关联的重数,则默认重数是1。,(2) 关联的角色(Role of relating) 参与此关联的对象所扮演的角色(即起的作用),例如,图9.7是一个递归关联(即一个类与它本身有关联关系)的例子。一个人与另一个人结婚,必然一个人扮演丈夫的角色,另一个人扮演妻子的角色。如果没有显式标出角色名,则意味着用类名作为角色名。,图9.7 关联的角色,(3) 限定关联(restrained relating) 通常用在一对多
3、或多对多的关联关系中,可以把模型中的重数从一对多变成一对一,或从多对多简化成多对一。在类图中把限定词放在关联关系末端的一个小方框内。 例如,某操作系统中一个目录下有许多文件,一个文件仅属于一个目录,在一个目录内文件名确定了惟一一个文件。图9.8利用限定词“文件名”表示了目录与文件之间的关系,可见,利用限定词把一对多关系简化成了一对一关系。,图9.8 一个受限的关联 由于目录加文件名可惟一地确定一个文件,因此,限定词“文件名”应该放在靠近目录的那一端。,(4) 关联类(class of relating) 为了说明关联的性质可能需要一些附加信息。可以引入一个关联类来记录这些信息。关联中的每个连接
4、与关联类的一个对象相联系。关联类通过一条虚线与关联连接。,例如,图9.9是一个电梯系统的类模型,队列就是电梯控制器类与电梯类的关联关系上的关联类。从图中可以看出,一个电梯控制器控制着4台电梯,这样,控制器和电梯之间的实际连接就有4个,每个连接都对应一个队列(对象),每个队列(对象)存储着来自控制器和电梯内部按钮的请求服务信息。电梯控制器通过读取队列信息,选择一个合适的电梯为乘客服务。关联类与一般的类一样,也有属性、操作和关联。,图9.9 关联类示例,2. 聚集(Aggregation) 聚集也称为聚合,是关联的特例。聚集表示类与类之间的关系是整体与部分的关系。在陈述需求时使用的“包含”、“组成
5、”、“分为部分”等字句,往往意味着存在聚集关系。除了一般聚集之外,还有两种特殊的聚集关系,分别是共享聚集和组合聚集。,图9.10 共享聚集示例 (1) 共享聚集(Share Aggregation) 如果在聚集关系中处于部分方的对象可同时参与多个处于整体方对象的构成,则该聚集称为共享聚集。一般聚集和共享聚集的图示符号,都是在表示关联关系的直线末端紧挨着整体类的地方画一个空心菱形。,图9.11 组合聚集示例 (2) 组合聚集(compose Aggregation) 如果部分类完全隶属于整体类,则该聚集称为组合聚集(简称为组成)。例如,窗口和它的组成部分之间存在着组合聚集关系。组成关系用实心菱形
6、表示。,3. 泛化(Generic) UML中的泛化关系就是通常所说的继承关系,它是通用元素和具体元素之间的一种分类关系。在UML中,用一端为空心三角形的连线表示泛化关系,三角形的顶角紧挨着通用元素。 注意,泛化针对类型而不针对实例,一个类可以继承另一个类,但一个对象不能继承另一个对象。 泛化关系指出在类与类之间存在“一般-特殊”关系。泛化可进一步划分成普通泛化和受限泛化。,图9.12 抽象类示例 (1) 普通泛化(Common Generic),图9.13 复杂类图示例,(2) 受限泛化(Restrained Generic) 可以给泛化关系附加约束条件,以进一步说明该泛化关系的使用方法或扩
7、充方法,这样的泛化关系称为受限泛化。预定义的约束有4种: 多重、不相交、完全和不完全。 多重继承指的是,一个子类可以同时多次继承同一个上层基类。 多重继承相反的是不相交继承,即一个子类不能多次继承同一个基类(这样的基类相当于C+语言中的虚基类)。 如果图中没有指定多重约束,则是不相交继承,一般的继承都是不相交继承。,图9.14 多重继承示例,完全继承指的是父类的所有子类都已在类图中穷举出来了,图示符号是指定完全约束。 不完全继承与完全继承恰好相反,父类的子类并没有都穷举出来,随着对问题理解的深入,可不断补充和维护,这为日后系统的扩充和维护带来很大方便。不完全继承是一般情况下默认的继承关系。,4
8、. 依赖和细化(Relying and Detailed ) (1) 依赖关系(Relying Relationship) 依赖关系描述两个模型元素(类、用例等)之间的语义连接关系: 其中一个模型元素是独立的,另一个模型元素依赖于独立的模型元素。 在UML的类图中,用带箭头的虚线连接有依赖关系的两个类,箭头指向独立的类。在虚线上可以带一个版类标签,具体说明依赖的种类,,图9.15 友元依赖关系 例如,图9.15表示一个友元依赖关系,该关系使得B类的操作可以使用A类中私有的或保护的成员。,(2) 细化关系(Detailed Relationship) 当对同一个事物在不同抽象层次上描述时,这些描
9、述之间具有细化关系。 假设两个模型元素A和B描述同一个事物,它们的区别是抽象层次不同,如果B是在A的基础上的更详细的描述,则称B细化了A,或称A细化成了B。 细化的图示符号为由元素B指向元素A的、一端为空心三角形的虚线(注意,不是实线),如图9.16所示。,图9.16 细化关系示例,动态模型表示瞬时的、行为化的系统的“控制”性质,它规定了对象模型中的对象的合法变化序列。 所有对象都具有自己的生命周期(或称为运行周期)。在每个特定阶段中,都有适合该对象的一组运行规律和行为规则。生命周期中的阶段也就是对象的状态。 各对象之间相互触发(即作用)就形成了一系列的状态变化。我们把一个触发行为称作一个事件
10、。对象对事件的响应,取决于接受该触发的对象当时所处的状态,响应包括改变自己的状态或者又形成一个新的触发行为。 状态有持续性,它占用一段时间间隔。状态与事件密不可分,事件表示时刻,状态代表时间间隔,9.5 动态模型(Dynamic Model),状态转换图(简称为状态图)通过描绘系统的状态及引起系统状态转换的事件,来表示系统的行为。此外,状态图还指明了作为特定事件的结果系统将做哪些动作(例如,处理数据)。因此,状态图提供了行为建模机制。,9.5.1 状态转换图(States Transform Daigram),一个状态代表系统的一种行为模式。状态规定了系统对事件的响应方式。系统对事件的响应,既
11、可以是做一个(或一系列)动作,也可以是仅仅改变系统本身的状态,还可以是既改变状态又做动作。 在状态图中定义的状态主要有:初态(即初始状态)、终态(即最终状态)和中间状态。 3.6.2 事件(events) 事件是在某个特定时刻发生的事情,它是对引起系统做动作或(和)从一个状态转换到另一个状态的外界事件的抽象。 事件就是引起系统做动作或(和)转换状态的控制信息。,3.6.1 状态(states),在状态图中,初态用实心圆表示,终态用一对同心圆(内圆为实心圆)表示。 中间状态用圆角矩形表示,上面部分为状态的名称;中间部分为状态变量的名字和值,这部分是可选的;下面部分是活动表,是可选的; 活动表的语
12、法格式如下: 事件名(参数表)/动作表达式 在活动表中经常使用下述3种标准事件(event):entry,exit和do。entry事件指定进入该状态的动作,exit事件指定退出该状态的动作,而do事件则指定在该状态下的动作。需要时可以为事件指定参数表。活动表中的动作表达式描述应做的具体动作。,3.6.3 符号(symbol),状态图中两个状态之间带箭头的连线称为状态转换,箭头指明了转换方向。状态变迁通常是由事件触发的,在这种情况下应在表示状态转换的箭头线上标出触发转换的事件表达式;如果在箭头线上未标明事件,则表示在源状态的内部活动执行完之后自动触发转换。,事件表达式的语法如下: 事件说明守卫
13、条件动作表达式 事件说明的语法为:事件名(参数表)。 守卫条件是一个布尔表达式。如果同时使用事件说明和守卫条件,则当且仅当事件发生且布尔表达式为真时,状态转换才发生。如果只有守卫条件没有事件说明,则只要守卫条件为真状态转换就发生。 动作表达式是一个过程表达式,当状态转换开始时执行该表达式。 图3.3给出了状态图中使用的主要符号。,图3.3 状态图中使用的主要符号,功能模型表示变化的系统的“功能”性质,它指明了系统应该“做什么”,因此更直接地反映了用户对目标系统的需求。 通常,功能模型由一组数据流图组成。在面向对象方法学中,数据流图远不如在结构分析、设计方法中那样重要。一般说来,与对象模型和动态
14、模型比较起来,数据流图并没有增加新的信息,但是,建立功能模型有助于软件开发人员更深入地理解问题域,改进和完善自己的设计。因此,不能完全忽视功能模型的作用。,9.6 功能模型(fucntion model),9.6.1 用例图(Use-Case Diagram) UML提供的用例图也是进行需求分析和建立功能模型的强有力工具,称为用例模型。它描述了开发者和用户对需求规格所达成的共识。 模型元素有系统、行为者、用例及用例之间的关系。 图9.17是自动售货机系统的用例图。 1. 系统(System) 系统被看作是一个提供用例的黑盒子,内部如何工作、用例如何实现,这些对于建立用例模型来说都是不重要的。
15、代表系统的方框的边线表示系统的边界,用于划定系统的功能范围,定义了系统所具有的功能。描述该系统功能的用例置于方框内,代表外部实体的行为者置于方框外。,图9.17 自动售货机系统用例图 连线表示行为者与系统用例的关系。,2. 用例(Use-case) 在UML中把用例定义成系统完成的一系列动作,动作的结果能被特定的行为者察觉到。用例具有下述特征: (1) 用例代表某些用户可见的功能,实现一个具体的用户目标; (2) 用例总是被行为者启动的,并向行为者提供可识别的值; (3) 用例必须是完整的。 用例代表一类功能而不是使用该功能的某个具体实例。用例的实例是系统的一种实际使用方法,通常把用例的实例称
16、为脚本。脚本是系统的一次具体执行过程。,例如,在自动售货机系统中,张三投入硬币购买矿泉水,系统收到钱后把矿泉水送出来,上述过程就是一个脚本;李四投币买可乐,但是可乐已卖完了,于是系统给出提示信息并把钱退还给李四,这个过程是另一个脚本。 . 行为者(Actor) 行为者是指与系统交互的人或其他系统,它代表外部实体。使用用例并且与系统交互的任何人或物都是行为者。 行为者代表一种角色,而不是某个具体的人或物。事实上,一个具体的人可以充当多种不同角色。,4. 用例之间的关系(Relationship of actors) 泛化关系的两种不同形式。 (1) 扩展关系(Extended) 向一个用例中添加
17、一些动作后构成了另一个用例,这两个用例之间的关系就是扩展关系,后者继承前者的一些行为,通常把后者称为扩展用例。,图9.18 含扩展和使用关系的用例图 把常规动作放在“售货”用例中,而把非常规动作放置于“售散装饮料”用例中,这两个用例之间的关系就是扩展关系。在用例图中,用例之间的扩展关系图示为带版类扩展的泛化关系。,(2) 使用关系(Use) 当一个用例使用另一个用例时,这两个用例之间就构成了使用关系。用带版类使用的泛化关系表示,如图9.18所示。 请注意扩展与使用之间的异同: 使用和扩展的目的是不同的。通常在描述一般行为的变化时采用扩展关系;在两个或多个用例中出现重复描述又想避免这种重复时,可
18、以采用使用关系。,9.6.2 用例建模(Use-case Modeling) 一个用例模型由若干幅用例图组成。创建用例模型的工作包括: 定义系统,寻找行为者和用例,描述用例,定义用例之间的关系,确认模型。其中,寻找行为者和用例是关键。 1. 寻找行为者 下述问题有助于发现行为者: 谁将使用系统的主要功能(主行为者)? 谁需要借助系统的支持来完成日常工作? 谁来维护和管理系统(副行为者)? 系统控制哪些硬件设备?,系统需要与哪些其他系统交互? 哪些人或系统对本系统产生的结果(值)感兴趣? 2. 寻找用例 每个行为者回答下述问题来获取用例: 行为者需要系统提供哪些功能?行为者自身需要做什么? 行为
19、者是否需要读取、创建、删除、修改或存储系统中的某类信息? 系统中发生的事件需要通知行为者吗?行为者需要通知系统某些事情吗?从功能观点看,这些事件能做什么?,行为者的日常工作是否因为系统的新功能而被简化或提高了效率? 针对整个系统的问题,也能帮助建模者发现用例,例如: 系统需要哪些输入输出?输入来自何处?输出到哪里去? 当前使用的系统存在的主要问题是什么? 一个用例必须至少与一个行为者相关联。,功能模型指明了系统应该“做什么”; 动态模型明确规定了什么时候(即在何种状态下接受了什么事件的触发)做; 对象模型则定义了做事情的实体。 在面向对象方法学中,对象模型是最基本最重要的,它为其他两种模型奠定
20、了基础,依靠对象模型完成3种模型的集成。,9.7 3种模型之间的关系 (Relationship of three models),面向对象方法学比较自然地模拟了人类认识客观世界的思维方式,它所追求的目标和遵循的基本原则,就是使描述问题的问题空间和在计算机中解决问题的解空间,在结构上尽可能一致。 面向对象范型明显优于结构化范型。此外,使用面向对象范型能够开发出稳定性好、可重用性好和可维护性好的软件,这些都是面向对象方法学的突出优点。 用面向对象方法开发软件时,阶段的划分是十分模糊的,通常在分析、设计和实现等阶段间多次迭代。喷泉模型是典型的面向对象软件过程模型。,9.8 小结,用面向对象观点建立
21、系统的模型从3个互不相同然而又密切相关的角度建立起3种不同的模型。它们分别是描述系统静态结构的对象模型、描述系统控制结构的动态模型、以及描述系统计算结构的功能模型。其中,对象模型是最基本、最核心、最重要的。 统一建模语言UML是国际对象管理组织OMG批准的基于面向对象技术的标准建模语言。通常,使用UML的类图来建立对象模型,使用UML的状态图来建立动态模型,使用数据流图或UML的用例图来建立功能模型。在UML中把用用例图建立起来的系统模型称为用例模型。,9-1 什么是面向对象方法学?它有哪些优点? 9-2 什么是“对象”?它与传统的数据有何异同? 9-3 什么是“类”? 9-4 什么是“继承”? 9-5 什么是模型?开发软件为何要建模? 9-6 什么是对象模型?建立对象模型时主要使用哪些图形符号?这些符号的含义是什么? 9-7 什么是动态模型?建立动态模型时主要使用哪些图形符号?这些符号的含义是什么?,习题,9-8 什么是功能模型?建立功能模型时主要使用哪些图形符号? 9-8 试用面向对象观点分析、研究本书第2章中给出的定货系统的例子。在这个例子中有哪些类?试建立定货系统的对象模型。 9-10 建立定货系统的用例模型。,
链接地址:https://www.31doc.com/p-2608943.html