浅谈UML中类之间的五种关系及其在代码中的表现形式
本文转载:http://www.cnblogs.com/DebugLZQ/archive/2013/05/13/3066715.html
什么是类?
将某类东西归纳在一起,可以成为一个类。
类有很多种提炼角度,需要根据系统地目标、业务的场景,选取合适的角度对事物进行归纳。
什么是类图?
类图可能是UML中使用的最多的一种图。
和其他图一样,类图的基本语法并不复杂,可能一两天就能掌握,但是真正做到灵活的使用类图,可能需呀多年的功力。
类图是锻炼OOA(OO Analysis)和OOD(OO Design)思想的重要工具,有助于OOA、OOD思想的提升。
本篇博文,重点讲述类图中类与类之间的关系以及这种关系在代码中的实现形式。写作本文的原因是:网上关于UML类图的语法规则等的资料很多,但是涉及到关系在代码中实现形式的文章却很少。这是很容易理解的:UML语法规范什么的各种书上导出都是,网页上的也很多都是对各种语法规范的Copy;而类之间的关系反应到代码层面需要加入个人的理解。两者的区别是一个不需要动脑子,Copy过来就行,而另一个需要动脑子。
类与类之间的关系
类与类之间的关系可以根据关系的强度依次分为以下五种:
依赖关系(Dependency)---关联关系(Association)---聚合(Aggregation)---组合(Composition)---泛化(Generalization)
1.依赖关系(Dependency)
依赖关系使用虚线加箭头表示,如下图所示:

这个例子可能不太好(Animal体内有Water,),换一个:

解释以下:Person 和 Computer之间是没有关系的,但是由于偶尔的需要,Person需要使用Computer,这时Person就依赖于Computer.
依赖关系是五种关系中耦合最小的一种关系。
类A要完成某个功能必须引用类B,则类A依赖类B。C#不建议双向依赖,也就是相互引用。
上述依赖关系在代码中的表现形式:这两个关系类都不会增加属性。


那么,Person类如何使用Computer类呢?有三种方式:
依赖关系的三种表现形式:
1.Computer类是public的,Person类可以调用它。
2.Computer类是Person类中某个方法的局部变量,则Person类可以调用它。代码如下:

Person有一个Programing方法,Computer类作为该方法的变量来使用。
注意Computer类的生命周期,当Programing方法被调用的时候,才被实例化。
持有Computer类的是Person类的一个方法,而不是Person类,这点是最重要的。
3.Computer类作为Person类中某个方法的参数或返回值。

Computer类被Person类的一个方法所持有,生命周期随着方法执行结束而结束。
在依赖关系中,必须使用这三种方法之一。
2.关联关系(Association)
关联关系是实线加箭头表示。表示类之间的关系比依赖要强。
例如,水和气候是关联的,表示如下:

在代码中的表现如下:

可见,在Water类属性中增加了Climate类。
关联关系有单向关联、双向关联、自身关联、多维关联等等。其中后三个可以不加箭头。
单向关联:

双向关联:

自身关联:

多维关联:

关联和依赖的区别:
- 从类的属性是否增加的角度看:
发生依赖关系的两个类都不会增加属性。其中的一个类作为另一个类的方法的参数或者返回值,或者是某个方法的变量而已。
发生关联关系的两个类,其中的一个类成为另一个类的属性,而属性是一种更为紧密的耦合,更为长久的持有关系。
- 从关系的生命周期来看:
依赖关系是仅当类的方法被调用时而产生,伴随着方法的结束而结束了。
关联关系是当类实例化的时候即产生,当类销毁的时候,关系结束。相比依赖讲,关联关系的生存期更长。
3.聚合(Aggregation)
4.组合(Composition)
引用程杰的《大话设计模式》里举大那个大雁的例子 :
大雁喜欢热闹害怕孤独,所以它们一直过着群居的生活,这样就有了雁群,每一只大雁都有自己的雁群,每个雁群都有好多大雁,大雁与雁群的这种关系就可以称之为聚合。
另外每只大雁都有两只翅膀,大雁与雁翅的关系就叫做组合。
有此可见:
聚合的关系明显没有组合紧密,大雁不会因为它们的群主将雁群解散而无法生存;
而雁翅就无法脱离大雁而单独生存——组合关系的类具有相同的生命周期。
聚合关系图:

组合关系图:

在代码中表现如下:

这两种关系的区别是:
1.构造函数不同
- 聚合类的构造函数中包含另一个类的实例作为参数
因为构造函数中传递另一个类的实例,因此大雁类可以脱离雁群类独立存在。
- 组合类的构造函数包含另一个类的实例化
因为在构造函数中进行实例化,因此两者紧密耦合在一起,同生同灭,翅膀类不能脱离大雁类存在。
2.信息的封装性不同
在聚合关系中,客户端可以同时了解GooseGroup类和Goose类,因为他们是独立的。
在组合关系中,客户端只认识大雁类,根本不知道翅膀类的存在,因为翅膀类被严密地封装在大雁类中。
5.泛化(Generalization)
泛化是学术名称,通俗的来讲,通常包含类与类之间的继承关系和类与接口实现关系。
类与类之间的泛化

接口的实现

题外话:这种东西不可纸上谈兵,需要多多实践,实践-认识-再实践-再认识,不断地批评与自我批评。
理解这个就能看懂各种:设计模式(的UML描述),并且构建相应的C#代码!
欢迎批评指正,Wish it helps.
浅谈UML中类之间的五种关系及其在代码中的表现形式的更多相关文章
- UML中类之间的几种关系
类之间可能存在以下几种关系:关联(association).依赖(dependency).聚合(Aggregation,也有的称聚集).组合(Composition).泛化(generalizatio ...
- [UML] UML中类之间的几种关系
类之间可能存在以下几种关系:关联(association).依赖(dependency).聚合(Aggregation,也有的称聚集).组合(Composition).泛化(generalizatio ...
- UML中类图的四种关系及其代码实现
在uml图中 最复杂的也就是泛化,实现.依赖,关联.这四种关系了,假设弄清了这几种关系那么在理解UML图的时候就会变得轻车熟路了! 假设你对着几种关系一点都不熟悉的话能够看一下uml中的四种关系.这篇 ...
- 【转】浅谈UML的概念和模型之UML九种图
原文地址:浅谈UML的概念和模型之UML九种图 目录: UML的视图 UML的九种图 UML中类间的关系 上文我们介绍了,UML的视图,在每一种视图中都包含一个或多种图.本文我们重点讲解UML每种图的 ...
- 浅谈UML——九种图(一)
前言 学UML将近两个星期了,对UML有了一定的了解,学过的没学过的都知道UML中最最最核心的部分要数那九个图了.浅谈UML九种图. 实例 1.用例图: 什么是用例?描绘一个系统外在可见的需求情况,是 ...
- 【转】UML中类与类之间的5种关系表示
一.继承关系 继承指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口)的功能,并可以增加它自己的新功能的能力.在Java中继承关系通过关键字extends明确标识,在设计时一 ...
- uml图的五种关系 标签: uml 2016-12-18 21:47 221人阅读 评论(25) 收藏
统一建模语言 Unified Modeling Language (UML)又称统一建模语言或标准建模语言,是始于1997年一个OMG标准,它是一个支持模型化和软件系统开发的图形化语言,为软件开发的所 ...
- UML类图五种关系与代码的对应关系
转: UML类图中的五种关系的耦合强弱比较:依赖<关联<聚合<组合<继承 一.依赖关系: (一)说明 虚线+箭头 可描述为:Uses a 依赖是类的五种关系中耦合最小的一种关系 ...
- $.ajax()方法详解 ajax之async属性 【原创】详细案例解剖——浅谈Redis缓存的常用5种方式(String,Hash,List,set,SetSorted )
$.ajax()方法详解 jquery中的ajax方法参数总是记不住,这里记录一下. 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为Str ...
随机推荐
- Go语言探险思考笔记
最近接触对象存储,国际上鼎鼎有名的Amazon S3还有Google Cloud Service在国内由于防火墙还有机房过远的问题,并不能投入生产使用.国内有名的对象存储,大家众所周知的七牛云,后台就 ...
- windows下配置wnmp
最近尝试windows下配置nginx+php+mysql,在这里总结一下. 1.下载windows版本的nginx,官网下载地址:http://nginx.org/en/download.htm, ...
- paramiko模块实现堡垒机
通过SSHClient 执行命令 """通过用户名密码验证""" import paramiko # 创建 SSH 对象 ssh = par ...
- Python Standard Library 学习(一) -- Built-in Functions 内建函数
内建函数列表 Built-in Functions abs() divmod() input() open() staticmethod() all() enumerate() int() ord() ...
- python中的函数的参数和可变参数
最近在搞python的过程中需要用到给函数传可变参数..所以去网上找前人的帖子学习了一下 为了尊重原作者,这里附上链接:http://www.cnblogs.com/tqsummer/archive/ ...
- 手写js面向对象选项卡插件
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- C语言之 短路原则
a=0;b=1 c=a&&(b=3) 最终c=0; b=1 因为从左至右进行时,若遇到运算符左边的操作数是 0(逻辑假),则停止运算. a=1;b=1;c=0; d=a||b||(c= ...
- Java中getAttribute getParameter 区别
网上说的不少,发现都是同一篇,汗..... (1)HttpServletRequest类有setAttribute()方法,而没有setParameter()方法 (2)当两个Web组 ...
- Prince and Princess
hdu4685:http://acm.hdu.edu.cn/showproblem.php?pid=4685 题意:有n个王子和m个公主,每个王子都会喜欢若干个公主,也就是王子只跟自己喜欢的公主结婚公 ...
- 多线程操作中为什么使用while而不是if来做判断状态是否就绪
在多线程操作中,我们常常会遇到需要先判断信号量状态是否就绪,然后执行后续操作的场景.这里对状态的判断使用的是while而不是单线程下常用的if. 以下示例展示了一个简单的生产者-消费者模型:当队列满的 ...