指南:关联关系

关联关系

关联关系用于对多个实例间的双向语义连接进行建模。
主题

关联关系 返回页首

关联关系表示不同类的对象之间的结构关系,它在一段时间内将多个类的实例连接在一起(这与依赖关系不同,依赖关系表示两个实例之间的临时关联关系)。

您可以使用关联关系表示对象了解其他对象。有时,对象必须相互引用才能实现交互,例如互相发送消息。因此,在某些情况下,关联关系可以采用序列图和协作图中的交互模式。

关联关系名称 返回页首

多数关联关系是二元的(即只存在于两个类之间),在图中表示为连接类符号对的实线路径。既可能是关联关系具有名称,也可能是各关联关系角色具有名称。最好采用角色名称,因为它们能表达更多信息。如果只能给其中一个角色命名,那么只要该关联关系将是单向的(即从与该角色名称相关的对象引出),角色名称仍比关联关系名称更可取。

关联关系通常是在分析过程中命名的,此时还没有足够的信息来对角色进行适当的命名。如果使用关联关系名称,关联关系名称就应该反映该关系的目的,并且应该是一个动词词组。关联关系名称应放置在关联关系路径上或其附近。

示例

在 ATM 中,钞箱提供出钞模块需要的钱。为了使出钞模块能够出钞,它必须随时能对钞箱对象进行引用。同样,如果钞箱中的现金被取尽,就必须通知出钞模块对象,所以钞箱必须随时能对出钞模块进行引用。有一种关联关系可对这种引用进行建模。

一个关联关系名称示例

出钞模块钞箱之间的关联关系,其名称为提供现金

如果选择了不适当的关联关系名称,就会导致理解上的混乱和错误。以下是对关联关系名称使用好坏的正反示例:

好的关联关系名称和坏的关联关系名称

好关联关系名称和坏关联关系名称示例

角色 返回页首

关联关系的两端为角色,角色规定了类在关联关系中所起的作用每个角色都必须有名称,而且对应一个类的所有角色名称都必须是唯一的。角色名称应该是一个名词,能够表达被关联关系对象的角色与关联关系对象之间的关系。例如,在与教程的关联关系中,教师的合适角色名称就可以是讲师;应避免使用“”和“包含”之类的名称,因为它们不能提供有关类间关系的信息。

注意,关联关系名称和角色名称的使用是互斥的:不能同时使用关联关系名称角色名称。角色名称通常比关联关系名称更可取,除非没有足够的信息来正确命名角色(这常见于分析阶段中;在设计阶段中应始终使用角色名称)。如果没有好的角色名称,通常都意味模型不完善或构建不合理。

角色名称紧邻关联关系线的末端。

示例

以一个订单输入系统中各类之间的关系为例。客户可以使用两种不同地址:一个帐单发送地址和一些订货发送地址。结果,客户和地址之间存在两个关联关系,如下所示。这些关联关系中标注了关联关系地址为客户担任的角色

关联关系示例

客户地址订单之间的关联关系,显示了角色名称和多重性。

多重性 返回页首

对于每个角色,您都可以指定其类的多重性,即该类的多少个对象可以与另一个类的一个对象相关联。多重性由角色上的文本表达式指出。表达式是一个由逗号隔开的整数范围列表。一个整数范围由一个整数下限、两个圆点和一个整数上限来表示。单个整数也是有效的范围,而符号 '*' 表示“许多”,即对象的数量不受限制。符号 '*' 本身等价于 '0..*',即包括零在内的任何数;这是默认值。一个可选标量角色的多重性为 0..1。

示例

上例中显示了订单和客户之间以及客户和地址之间关联关系的多重性。从该图可看出,一份订单必然有一个关联关系的客户(客户的多重性为 1..1),但是客户却可能没有任何订单(订单的多重性为 0..*)。此外,一个客户有一个帐单发送地址,但是有一个或多个送货地址。为了减少符号带来的混乱,如果忽略多重性,就可以将它们假定为 1..1。

导向性 返回页首

角色的导向性特征表示可以通过关联关系从关联类导向到目标类上。这可通过多种方式来实施:直接引用对象、关联关系数组、散列表或其他任意一种允许一个对象引用另一个对象的实施技术。导向性用一个开箭头表示,该箭头置于关联关系线的目标端,紧靠目标类(即所导向的类)。导向性特征的默认值为 true

示例

在订单输入示例中,订单客户之间可以进行双向导航:订单必须知道是哪位客户发出的订单,而客户必须知道他发出了哪一个订单。如果没有显示箭头,则默认关联关系能够双向导航。

客户地址之间的关联关系中,客户必须知道其地址,但是地址却并不知道哪位客户(或其他类,因为许多事物都有地址)与该地址相关联。结果,关联关系中客户一端的导向性特征被关闭,图示如下:

关联关系导向性示例

更新后的订单输入系统类,显示关联关系的导向性。

自关联关系 返回页首

有时,一个类与其自身存在一种关联关系。这并不一定意味着该类的某个实例与其自身存在关联关系,更多的情况下,它意味着该类的某个实例与该类的其他实例之间存在关联关系。在自关联关系的情况下,角色名称对于区分关联关系的目的非常重要。

示例

以涉及类雇员的自关联关系为例:

自关联关系示例

在此示例中,一个雇员可能与其他雇员存在关联关系;如果如此,那么该雇员为经理,而其他雇员则是此经理的属下。由于雇员知道他们的经理,而经理也知道他的属下,所以该关联关系能够双向导航。

多重关联关系 返回页首

在相同对象关联关系两次的类之间做两个关联关系;一个指定对象可通过不同的关联关系链接到不同的对象上。每个关联关系都是独立的,用角色名称来区分。如上所示,一个客户能与同一个类的不同实例之间建立关联关系,而且每个关联关系都有不同的角色名称。

角色排序 返回页首

如果关联关系的多重性大于 1,则那些被关联关系的实例就可能会排序。角色排序特征意味着参与关联关系的那些实例要进行排序。在默认情况下,它们是并不进行排序。模型并未规定如何对排序进行维护;用于对排序后的关联关系进行更新的操作必须规定更新元素的插入位置。

链接 返回页首

一个关联关系的各个实例称为链接;一个链接就是实例间的关系。可以通过链接发送消息,而且链接可以表示对象间的引用和聚合关系。参见指南:协作图以获取详细信息。

关联类 返回页首

关联类是一种关联关系,它具有类的特征(例如属性、操作和关联关系)。它用一条从关联关系路径到类符号的虚线表示,其中类符号包含此关联关系的属性、操作和关联关系。这些属性、操作和关联关系适用于原始关联关系本身。关联关系中的每个链接都有指定的特征。关联类最常见的用途是协调多对多关系。原则上,关联关系和类的名称应该是一致的,但是在必要情况下,也可使用不同的名称。一个退化的关联类只包含此关联关系的属性;在这种情况下,您可以忽略关联类名称,以弱化其独立性。

示例

借用并扩展前面的雇员示例。考虑一下一名雇员(职员)为另一名雇员(经理)工作的情况。经理定期对职员进行评估,以反映出他们在一定时间内的表现。

评估不能作为经理或职员个人的属性,但是我们可以将评估信息与此关联关系自身进行关联关系,如下所示:

关联类示例

关联类评估获取了与关联关系自身有关的信息。

限定关联关系 返回页首

可使用限定词进一步限定和定义一组与另外某个实例相关联的实例;一个对象和一个限定词的值可以确定该关联关系的一组唯一对象,从而形成一个复合关键字。限定通常会降低关联关系另外一端角色的多重性;多重性净值显示相关类中有多少个实例与第一个类以及给定限定词的值相关联。限定词表示为关联关系一端紧靠限定类的小框。他们是关联关系的一部分,而不是类的一部分。一个限定词框可以包含多个限定词的值;限定以整个值列表为基础。限定关联关系是关联关系属性的一种变体。

示例

考虑对明细分类项产品之间的关联关系进行的以下改进:明细分类项与所订购的产品之间存在关联关系。每个明细分类项引用且只涉及一件产品,而一件产品则可以在多个明细分类项中订购。通过使用限定词产品代码对该关联关系进行限定,我们还指出每个产品具有一个唯一的产品代码,而明细分类项则是通过这个产品代码与产品相关联的。

一个限定的关联关系

明细分类项产品之间的关联关系具有限定词产品代码

N 维关联关系 返回页首

N 维关联关系是指在三个或更多类之间的关联关系,其中单个类可以多次出现。N 维关联关系表示为一个大菱形,菱形上对应每个参与类都有一条关联关系路径发出。这是关联关系的实体关系模型的传统符号。为简洁起见,二元关联关系不用菱形表示,因为实际模型中大多数是二元关联关系。N 维关联关系相当少见,而且可以将他们晋升为类来建模。N 维关联关系还可以有关联类;这可用菱形到类符号的虚线来表示。角色可以有角色名称,但是多重性更加复杂,最好是通过列出备选关键字来加以说明。如果给出了多重性,那么它代表的实例数量对应于所指定的其他 N-1 个对象组。多数 N 维关联关系都可以使用限定的关联关系或者关联类来消除。他们还可以被普通类替代,尽管这会失去一种限制,即一个指定的参与对象元组只能有一个链接。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基本信息 原书名:WebGL Programming Guide: Interactive 3D Graphics Programming with WebGL (OpenGL) 原出版社: Addison-Wesley Professional 作者: (美)Kouichi Matsuda Rodger Lea(松田浩一,罗杰.李) 译者: 谢光磊 出版社:电子工业出版社 ISBN:9787121229428 上架时间:2014-6-11 出版日期:2014 年6月 开本:16开 页码:470 版次:1-1 ---------------------------------------- 目录 《WebGL编程指南》 第1 章 WebGL 概述 1 WebGL 的优势 3 使用文本编辑器开发三维应用 3 轻松发布三维图形程序 4 充分利用浏览器的功能 5 学习和使用WebGL 很简单 5 WebGL 的起源 5 WebGL 程序的结构 6 总结 7 第2 章 WebGL 入门 9 Canvas 是什么? 10 使用[canvas] 标签 11 DrawRectangle.js 13 最短的WebGL 程序:清空绘图区 16 HTML 文件(HelloCanvas.html) 16 JavaScript 程序(HelloCanvas.js) 17 用示例程序做实验 22 绘制一个点(版本1) 22 HelloPoint1.html 24 HelloPoint1.js 24 着色器是什么? 25 使用着色器的WebGL 程序的结构 27 初始化着色器 29 顶点着色器 31 片元着色器 33 绘制操作 34 WebGL 坐标系统 35 用示例程序做实验 37 绘制一个点(版本2) 38 使用attribute 变量 38 示例程序(HelloPoint2.js) 39 获取attribute 变量的存储位置 41 向attribute 变量赋值 42 gl.vertexAttrib3f() 的同族函数 44 用示例程序做实验 45 通过鼠标点击绘点 46 示例程序(ClickedPoints.js) 47 注册事件响应函数 48 响应鼠标点击事件 50 用示例程序做实验 53 改变点的颜色 55 示例程序(ColoredPoints.js) 56 uniform 变量 58 获取uniform 变量的存储地址 59 向uniform 变量赋值 60 gl.uniform4f() 的同族函数 61 总结 62 第3 章 绘制和变换三角形 63 绘制多个点 64 示例程序(MultiPoint.js) 66 使用缓冲区对象 69 创建缓冲区对象(gl.createBuffer()) 70 绑定缓冲区(gl.bindBuffer()) 71 向缓冲区对象中写入数据(gl.bufferData()) 72 类型化数组 74 将缓冲区对象分配给attribute 变量(gl.vertexAttribPointer()) 75 开启attribute 变量(gl.enableVertexAttribArray()) 77 gl.drawArrays() 的第2 个和第3 个参数 78 用示例程序做实验 79 Hello Triangle 80 示例程序(HelloTriangle.js) 80 基本图形 82 用示例程序做实验 83 Hello Rectangle(HelloQuad) 84 用示例程序做实验 85 移动、旋转和缩放 86 平移 87 示例程序(TranslatedTriangle.js) 88 旋转 91 示例程序(RotatedTriangle.js) 93 变换矩阵:旋转 97 变换矩阵:平移 100 4×4 的旋转矩阵 101 示例程序(RotatedTriangle_Matrix.js) 102 平移:相同的策略 105 变换矩阵:缩放 106 总结 108 第4 章 高级变换与动画基础 109 平移,然后旋转 109 矩阵变换库:cuon-matrix.js 110 示例程序(RotatedTriangle_Matrix4.js) 111 复合变换 113 示例程序(RotatedTranslatedTriangle.js) 115 用示例程序做实验 117 动画 118 动画基础 119 示例程序(RotatingTriangle.js) 119 反复调用绘制函数(tick()) 123 按照指定的旋转角度绘制三角形(dr

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值