UML中的类图关系总结

      类图以前上课也学过,看博客也看过,对于继承实现的含义和画法早已掌握,但不知怎么回事对于依赖、组合、关联这几种关系总搞不清楚箭头应该应该指向那个类,对于他们间的具体差异有时候也会有些混淆。在此进行一个总结。

一、各种关系的总结

1.依赖

可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、、临时性的、非常弱的,但是B类的变化会影响到A;表现在代码层面,为类B作为参数被类A在某个method方法中使用:比如在用户登录时用户类(User)调用系统中的加解密类的加密静态方法(EncryptAndDecryptUtil.encrypt)对用户输入的密码就行加密,而后与数据库存储的密文密码就行比对。此时User与EncryptAndDecryptUtil之间的关系就是依赖;

2.关联

它体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的、关联可以是单向、双向的;表现在代码层面,为被关联类B以类属性的形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量;如J2EE开发中的Action和Service的关系,Action和Service的关系是长期性的,必然的

3.聚合

聚合是关联关系的一种特例,体现的是整体与部分、拥有的关系,即has-a的关系,但此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享;比如计算机与CPU、公司与员工的关系等;表现在代码层面,和关联关系是一致的,只能从语义级别来区分

4.组合

组合也是关联关系的一种特例,他体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合;同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束;比如你和你的大脑;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;

对于继承和实现这两种比较简单,在这就不再做介绍。

小结:从代码层面看只要一个类中包含了另一个类那么它们间就存在关系,因为这个类的行为需要另一个类的某个属性或某个属性才可以实现。但是人为的对此进行了区分,就像把按照年龄这个维度将“人”区分为“婴儿、小孩、少年、青年、中年、老年”等。通过“关系紧密程度”的维度将其又区分为了“依赖、关联、组合、聚合”等。

按照关系紧密程度有强到弱分别为:组合>聚合>关联>依赖

二、箭头指向的总结

  1. 组合、聚合关系:A由B组成,指向A
  2. 依赖关系:A使用B的方法,指向B
  3. 关联关系:A与B关联,指向B

 

参考资料:

  1. http://www.uml.org.cn/oobject/201006114.asp
  2. http://liuchuxiong2003.blog.sohu.com/168088327.html

 

posted on 2012-12-20 19:31  孙振超  阅读(891)  评论(0编辑  收藏  举报