注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

依赖如何体现与关联的区别联系  

2013-10-24 12:54:58|  分类: UML+设计模式 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
依赖如何体现与关联的区别联系
声明:此文中引用了很多网上的资料,如有不妥,请及时指出。非常感谢。
一.A dependency exists between two elements if changes to the definition of one element (the supplier) may cause changes to the other (the client). With classes, dependencies exist for various reasons: One class sends a message to another; 

one class has another as part of its data; one class mentions another as a parameter to an operation. If a class changes its interface, any message sent to that class may no longer be valid.     

如果两个元素其中一个的定义发生改变则会引起另一个元素发生变化则称这两个元素之间存在依赖关系,对于类来说,依赖可能存在于下列几种情况中:
1、一个类要发送消息给另一个类;
2、一个类将另一个类作为其数据的一部分;(可能依赖的那个类是公共类(包括静态类);或者是成员变量;或者是函数内的临时变量;还有可能是函数的返回值)
3、一个类的操作中将另一个类作为其参数。如果一个类改变了接口,则任何发送给该类的消息可能不再有效了。

需要说明的是:假如A类依赖B类,则UML类图的箭头是从在B方。即从A指向B。
关联在该书中没有这样去定义,作者列举了一个例子说明了双向关联的含义,汽车和车主类的实现。在汽车类中包含了车主成员,反过来车主类中也包含了其拥有的汽车成员集合,他们之间形成了双向关联。

这里是原文关于双向连接核心的描述:A bidirectional association is a pair of properties that are linked together as inverses. The inverse link between them implies that if you follow both properties, you should get back to a set that 

contains your starting point。

关联和依赖其实区别在于它们表达模型的时候描述的是两个不同的方面,依赖描述的是类发生改变引起其他类相应变化,它不仅可以由于类之间的关联引起,也可以由于类的参数变化(该参数也是类)以及类之间消息传递机制引起。只要是类发生了变化引起另一个类变

化都可说是存在依赖。

关联则表达的是类之间的包含关系,类实体之间数量关系,比如车和车主,定单和商品等。关联并不一定非要是依赖的,尽管车主和车之间存在包含关系,车的操作流程变了不一定要车主类相应变化,他仅仅只需要调用车的Move(),Stop()...就可以了。

二.关联associations:是类之间的词法连接,使一个类知道另一个类的公开属性和操作。关联有单向和双向之分。如果两个类是双向关联的,rose将属性放进彼此类中。单向关联如下图所示,则person知道house的公开属性和操作,而house不知道person的。交互图中

person可以向house发消息,而house不可以向person发消息。   
      
  通过交互图可以确定关联方向,如果交互图中总是person向house发消息,则是从person到house的单向关系。如果又有从house到person的关系,则需要双向关系。   
  单向关联有助于标识可复用的类。如果house和person间关系是双向的,则每个类都需要知道对方,因此两者都不能复用。任何输出多个单向关系的类都很难复用,而只接收单向关系的类则容易复用。如下图所示   
      
  依赖性dependencies:显示一个类引用另一个类,在c++中加入#include语句,因此被引用类的头文件的改变可能影响引用类。依赖与关联不同,首先依赖性总是单向的,显示一个依赖于另一个类的定义,其次rose不对依赖性产生属性。

下面再给一个设计模式中的例子:
  1: //策略模式的现金收费工厂类依赖正常收费子类收费子类

  2: 

  3:     //收费抽象类

  4:     abstract class CashSuper

  5:     {

  6:         public abstract double acceptCash(double money);

  7: 

  8:     }

  9:     //正常收费子类

 10:     class NormalSuper : CashSuper

 11:     {

 12:         public override double acceptCash(double money)

 13:         {

 14:             return money;

 15:         }

 16:     }

 17:     //现金收费工厂类

 18:     class CashFactory

 19:     {

 20:         public static CashSuper createCashAccept(string type)

 21:         {

 22:             CashSuper cs = null;

 23:             if (type =="正常收费")

 24:                 cs=new NormalSuper() ;

 25:             return cs;

 26:         }

 27:     }

  评论这张
 
阅读(570)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017