MyException - 我的异常网
当前位置:我的异常网» 软件设计 » UML的几种关系,包括关联关系,聚合关系,结合关系

UML的几种关系,包括关联关系,聚合关系,结合关系,依赖关系

www.myexceptions.net  网友分享于:2015-01-25  浏览:0次
UML的几种关系,包括关联关系,聚合关系,组合关系,依赖关系

   我想聊一聊UML的几种关系,包括关联关系,聚合关系,组合关系,依赖关系。

       在具体讨论之前我想先说一些废话,但又不得不说。由于自己曾经也因为这几种关系困惑过,所以我会以一种很容易理解的,简洁的方式来解释这几种关系,希望对正在寻觅的朋友们能有哪怕一点帮助,那么我的这篇文章也是有价值的,废话结束。

       首先我们应当明白,这几种关系都是对现实世界中确实存在的关系的描述和概括。下面我会将这几种关系对应到现实世界中确实存在的一些关系,这么做是因为我不想空洞地,莫名其妙地讲理论,我想将抽象的东西具体化,方便大家理解。当大家理解之后还需进行总结和概括。

       由于关联,聚合,组合是同一类关系,所以放在一起讲,并且按照我列出的顺序,关系的强度是递增的,稍后我将说明为什么。

       关联:

                

 在Java代码中表现为:

1 public class Person{  //The person who wears the clothes
2     private Colthes colthes;
3 }

 

       首先设定几个对象:①人,②穿着衣服的人,③衣服。“人”的存在与否不受衣服的影响。组成因素当然也不包含“衣服”。但是在一些特定时间或环境下“人”这个类必须要持有“衣服”这个类,此时产生了“穿着衣服的人”这个类。而“ 穿着衣服的人 ”和“衣服”是关联关系,表现在程序中是“人”这个类持有“衣服”这个类的一个对象从而组成了“ 穿衣服的人 ”这个类。(这是由“穿衣服的人”到“衣服”的单向关联,关联关系也可以是双向的。)由于对于“人”和“ 穿衣服的人 ”来说后者是前者在特定时刻,特定条件下的转换,正因对特定条件和特定时刻的需求,所以关联关系较弱。 由此可见关联关系是不连续的,也有一定的偶然性和临时性,但是这种偶然和临时比依赖强,表现形式也不同。

       聚合:

                      

 在Java代码中表现为:

1 public class Room {
2     private Wall wall;
3 }

 

       设定对象:①房间,②墙。无论什么时刻“墙”都是房间的组成成分,所以聚合相对关联较强。但一堵“墙”可以同时参与构成两个房子,“墙”与“房子”是一对多的关系,也就是说组成整体的成分对象可以被共享(基于同一时刻的共享),既在同一时刻一个部分可共同参与组成多个整体。

      组合:

                          

 在Java代码中表现为:

1 public interface Eye {
2 }

 

1 public class RightEye implements Eye {
2 }
1 public class LeftEye implements Eye { 
2 }
1 public class Person1 {
2     private Eye leftEye;
3     private Eye rightEye;
4 }

 

      设定对象:①人,②眼睛。无论什么时候“眼睛”都是“人”的组成成分,并且人和眼睛一一对应,一个“人”完全拥有具体的一对“眼睛”,并且完全拥有对这对眼睛的支配权(包括湮灭和转交)。在某个具体的时间点上这双眼睛只属于某一个具体的人。当整体湮灭的时候成分对象有两种结果:1.随整体湮灭,2.转交给其它整体。第二种情况是比较少见的。例如,一个人在活着的时候拥有一双确定的眼睛,湮灭后眼睛可以一起湮灭,也可以捐给别人(姚贝娜就这么做了)。但无论怎样,就眼睛来说同一时刻只能属于一个整体。所以在某一具体时刻整体的成份对象是不能被共享的。(部分可分时地去参与多个整体,例如一个人在活着的时候把自己的眼睛捐给了另一个人,一段时间后另一个人又把眼睛给了第三个人)。所以组合相对于聚合又更强。
      到这里前三种关系解释完毕,下面说一说依赖。

      依赖:

                        

   在Java代码中表现为:

1 public class Person {
2     public void Drive(Car car) {
3     
4     }
5     
6     public Car Create() {
7       return new Car();
8     }
9 }

 

      设定对象:①人,②车。设定行为:a人开车. b人造车。只有当人产生开车这个行为时对于人这个类来说才需要车这个类的对象,在程序中表现为人有一个函数是开车,而开车这个函数有一个参数是车的对象。人还可以有造车的行为,表现在程序中就是有一个函数,返回值是车。由此可见 依赖是一种临时的,不持久的,偶然的关联,对于类的存在完全没影响,只是行为,功能的需求,也就是说没有这种依赖,功能会欠缺。但不会影响到实物的性质。换句话说就是并不是谁一定离不开谁。

      正是由于这四种关系存在种种差异,所以能被区分,又由于前三种存在共同特性所以可归结为一类,但通过差异和共性所区分的这四种关系在现实中确实存在,所以是合理的。我所做的仅仅是将差异和共性展现了出来。

                                                             

                                              

1楼梁逸晨
据说偷看贵妃洗澡就会丧失自己双眼的支配权
Re: 药平丹
@梁逸晨,本人软件工程大三学生。自己写的,无须解释。

文章评论

我的丈夫是个程序员
我的丈夫是个程序员
每天工作4小时的程序员
每天工作4小时的程序员
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
程序员应该关注的一些事儿
程序员应该关注的一些事儿
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
程序员都该阅读的书
程序员都该阅读的书
代码女神横空出世
代码女神横空出世
如何成为一名黑客
如何成为一名黑客
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
老程序员的下场
老程序员的下场
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
一个程序员的时间管理
一个程序员的时间管理
程序员必看的十大电影
程序员必看的十大电影
漫画:程序员的工作
漫画:程序员的工作
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
中美印日四国程序员比较
中美印日四国程序员比较
旅行,写作,编程
旅行,写作,编程
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
编程语言是女人
编程语言是女人
程序员的鄙视链
程序员的鄙视链
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
总结2014中国互联网十大段子
总结2014中国互联网十大段子
Java程序员必看电影
Java程序员必看电影
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
 程序员的样子
程序员的样子
10个调试和排错的小建议
10个调试和排错的小建议
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
为什么程序员都是夜猫子
为什么程序员都是夜猫子
我是如何打败拖延症的
我是如何打败拖延症的
鲜为人知的编程真相
鲜为人知的编程真相
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有