依赖表示两个或多个模型元素之间语义上的关系。它只将模型元素本身连接起来而不需要用一组实例来表达它的意思。它表示了这样一种情形,提供者的某些变化会要求或指示依赖关系中客户的变化。
根据这个定义,关联和泛化都是依赖关系,但是它们有更特别的语义,故它们有自己的名字和详细的语义。我们通常用依赖这个词来指其他的关系。 表 4–3 列出了 UML 基本模型中的一些依赖关系。
依赖关系 |
关键字 |
|
访问 |
允许一个包访问另一个包的内容 |
access |
绑定 |
为模板参数指定值,以生成一个新的模型元素 |
bind |
call |
||
派生 |
声明一个实例可以从另一个实例导出 |
derive |
友员 |
允许一个元素访问另一个元素,不管被访问的元素是否具有可见性 |
friend |
输入 |
import |
|
实例化 |
关于一个类的方法创建了另一个类的实例的声明 |
instantiate |
参数 |
一个操作和它的参数之间的关系 |
parameter |
实现 |
说明和对这个说明的具体实现之间的映射关系 |
realize |
精化 |
声明具有两个不同语义层次上的元素之间的映射 |
refine |
发送 |
信号发送者和信号接收者之间的关系 |
send |
跟踪 |
声明不同模型中的元素之间存在一些连接,但不如映射精确 |
trace |
使用 |
use |
表 4–3 依赖关系种类
跟踪是对不同模型中元素的连接的概念表述,通常这些模型是开发过程中不同阶段的模型。跟踪缺少详细的语义,它特别用来追溯跨模型的系统要求和跟踪模型中会影响其他模型的模型所起的变化。
精化是表示位于不同的开发阶段或处于不同的抽象层次中的一个概念的两种形式之间的关系。这并不意味着两个概念会在最后的模型中共存,它们中的一个通常是另一个的未完善的形式。原则上,在较不完善到较完善的概念之间有一个映射,但这并不意味着转换是自动的。通常,更详细的概念包含着设计者的设计决定,而决定可以通过许多途径来制定。原则上讲,带有偏移标记的对一个模型的改变可被另一个模型证实。而实际上,现有的工具不能完成所有这些映射,虽然一些简单的映射可以实现。因此精化通常提醒建模者多重模型以可预知的方式发生相互关系。
导出表示一个元素可以通过计算另一个元素来得到 ( 而被导出的元素可以被明确包含在系统中以避免花费太多代价进行迭代计算 ) 。导出、实现、精化和跟踪是抽象的依赖 — 它们将同一个潜在事物的不同形式联系起来。
使用表示的是一个元素的行为或实现会影响另一个元素的行为或实现。通常,这来自于与实现有关的一些问题,如编译程序要求在编译一个类前要对另一个类进行定义。大部分使用依赖关系可以从代码中获得,而且它们不需要明确声明,除非它们是自顶向下设计风格的系统的一部分(如,使用预定义的构件或函数库)。特别的使用关系可以被详细说明,但是因为关系的目的就为了突出依赖,所以它常常被忽略。确切的细节可以从实现代码中获得。使用的构造型包括调用和实例。调用表示一个类中的方法调用另一个类的操作;实例表示一个类的方法创建了另一个类的实例。
若干种使用依赖允许某些元素访问其他元素。访问依赖允许一个包看到另一个包的内容。引入依赖能够达到更高要求,可以将目标包内容的名字加入到引入包的命名空间内。友员依赖是一种访问依赖,允许客户看到提供者的私有内容。
绑定是将数值分配给模板的参数。它是具有精确语义的高度结构化的关系,可通过取代模板备份中的参数实现。使用和绑定依赖在同一语义层上将很强的语义包括进元素内。它们必须连接模型同一层的元素(或者都是分析层,或者都是设计层,并且在同一抽象层)。跟踪和精化依赖更模糊一些,可以将不同模型或不同抽象层的元素连接起来。
关系(一个元关系,不只限于依赖关系)实例表示一个元素(如对象)是另一个元素(如类)的实例。
依赖用一个从客户指向提供者的虚箭头表示,用一个构造型的关键字来区分它的种类,如 图 4–11 所示。
图 4–11 依赖
=============================
·关联和依赖的区别
如果两个元素其中一个的定义发生改变则会引起另一个元素发生变化则称这两个元素之间存在依赖关系,对于类来说,依赖可能存在于下列几种情况中:一个类要发送消息给另一个类;一个类将另一个类作为其数据的一部分;一个类的操作中将另一个类作为其参数。如果一个类改变了接口,则任何发送给该类的消息可能不再有效了。
关联在该书中没有这样去定义,作者列举了一个例子说明了双向关联的含义,汽车和车主类的实现。在汽车类中包含了车主成员,反过来车主类中也包含了其拥有的汽车成员集合,他们之间形成了双向关联。
我认为这样关联和依赖其实区别在于它们表达模型的时候描述的是两个不同的方面,依赖描述的是类发生改变引起其他类相应变化,它不仅可以由于类之间的关联引起,也可以由于类的参数变化(该参数也是类)以及类之间消息传递机制引起。只要是类发生了变化引起另一个类变化都可说是存在依赖。
关联则表达的是类之间的包含关系,类实体之间数量关系,比如车和车主,定单和商品等。关联并不一定非要是依赖的,尽管车主和车之间存在包含关系,车的操作流程变了不一定要车主类相应变化,他仅仅只需要调用车的Move(),Stop()...就可以了。
原文链接:https://www.f2er.com/javaschema/288195.html