浅谈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.

时间: 2024-12-23 20:06:48

浅谈UML中类之间的五种关系及其在代码中的表现形式的相关文章

浅谈新人必知的五种网赚潜规则

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 如今网赚这个行业可以说是热的发烫,不时的就会造就百万千万富翁!所以很多人都削尖脑袋想要加入其中,可是网赚往往对于很多人来说,就像是盛开的玫瑰,看上去很美,如果你要是去采摘的话,则很容易就把自己的手指刺伤,很多人就是因为参加了网赚,而导致伤痕累累,最后不得不离开这个网站行业,是什么原因导致网赚的失败呢?关键是很多新人不知道网赚行业里面的潜规则,

浅谈网络营销专家总结的五种推广技巧

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 现在做网络营销也是非常不容易的,因为方法太多,如果都要把每种方法都用一用,那消耗的时间和精力是不可想象的,而且每一种推广方法都会产生一定的成本,每一种方法并不一定都合适你去做,做了也没有什么效果,那么我们如何做好自己网站的网络推广呢?那还是让我们听听网络营销给我们总结的五种技巧吧! 一:广告位要进行一定的投资,比如投资到广告联盟,购物平台的广

浅谈增强网站安全的五种办法

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 网站除了有很好的内容之外就要注意其中的安全性了,这是一个网站能够正常发展的基础,如果网站的安全性没有保障,甚至还会对客户造成损失,那么这样的网站又怎么能够值得信任呢?下面就和大家聊一聊如何提高网站安全的方法,希望能够对广大的站长们有所帮助! 一:选择IDC一定要考察其实力 其实做站长是很辛苦的,对于花钱一般都斤斤计较的很,可是在花钱购买空间上

大话UML中类之间的关系

关于uml的内容在大学的时候学习过,感觉是花拳绣腿的一些知识,想用但是限于自己的认知和经验,实在是很难运用,到了工作的时候,感觉不需要这些工作也照样能做得很出色,过度的自信就这样维持了几年,等到积累了一定的项目经验,对于设计的关注程度也逐渐提升,有时候想表达一些设计的思想,自己DIY的图表可能只有自己能够看懂,看一些设计思想中的图也是似懂非懂,看来刚学外语也是不够的,还得学习UML,无规矩不成方圆嘛,让UML来作为我们设计中的思想转化器. 说起UML中类之间的关系,大体有以下几类 继承关系(Ge

类与类之间的几种关系

一.继承关系      继承指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口)的功能,并可以增加它自己的新功能的能力.在Java中继承关系通过关键字 extends明确标识,在设计时一般没有争议性.在UML类图设计中,继承用一条带空心三角箭头的实线表示,从子类指向父类,或者子接口指向父接口.  二.实现关系      实现指的是一个class类实现interface接口(可以是多个)的功能,实现是类与接口之间最常见的关系.在Java中此类关系通过关键字 implements明确

浅谈自服务的大数据治理在企业数字化转型中的妙用

一.用户与大数据之间的鸿沟让数字化转型困难重重 本文讲的是浅谈自服务的大数据治理在企业数字化转型中的妙用,目前虽然不少企业已经广泛建设大数据平台,但却难以直接使用平台中的大数据,企业人员与大数据之间存在着一道难以逾越的鸿沟. 这道鸿沟的出现导致企业在使用大数据的过程中出现数据不可知.需求难实现.数据难共享等一系列问题: 1.数据不可知,数据价值无处可寻 企业环境中到底有哪些数据,这些数据在哪里,慢慢变成了大数据平台的"迷",用户迷失在动辄几十PB的数据中.对于企业管理者来说,无法从管理

浅谈寻找友情链接的几种方法

友情链接的几种方法,对于友情链接,是我们每一个心中的必须,我们都知道友情链接我们应该怎么做,我们应该怎么找,或者是应该怎么去交换,其实交换友情链接也就几种方式,对于每一种方式用到极致就是一把最有利的方式,浅谈一下如何进行最有效的友情链接方法了. 友情链接之一:发现. 生活中并不缺少美,缺少的是发现美的眼睛,对于友情链接,我们也应该去发现,因为你的每一种发现都将为你带来全新的感触,比如说想做行业站的友情链接,那么就去百度里面找这方面的站,行业站一般就是比较排名和流量了,有了排名,一般还要看PR,凝

浅谈Jquery页面初始化的4种方式_jquery

<script src="Scripts/jquery-1.8.2.min.js"></script> <script type="text/javascript"> $(document).ready(function () { alert("第一种方法."); }); $(function () { alert("第二种方法."); }); jQuery(function ($) { a

浅论成功运营人才网的五种方法

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 21世纪什么最吃香,人才!所以建立人才网站肯定能够有发展前途,而且现在个人投资人才网站的也有很多,因为建设人才网站所需要的资金是比较低的,本人做人才网也有很多年了,自己的网站从最初的艰难运营到现在已经能够有一定的盈利了,下面就把我的运营人才网站的五种方法跟大家分享一下! 一:要在半年之间获得盈利 其实建设一个网站现在已经不是什么难事了,可是要