前言

  最近有打算学习一下设计模式,所以就去看了园子里面左潇龙大哥的设计模式文章,看完之后只有一个感觉,我啥时候也能写出来这么牛逼的文章啊,但是我这语文老师死的早的人还是算了,但是设计模式还是要学的,这个博客还是要写的,所以还是接着写吧,遵从龙哥的教诲,学习设计模式之前先简单学习一下类图里面各种类的关系,因此就有了这篇随笔,废话不多说,下面进入正文。

类与类之间的关系

  类与类之间的关系从弱到强依次是:没有关系(这不是扯淡嘛)、依赖、关联、聚合、组合,还有泛化(其实就是继承)和实现,这俩大哥是在是没地方排了,就随便放着吧,下面一一介绍各个关系:

0.没有关系

  因为没有关系,所以从零开始;

1.依赖

  为什么说依赖是类与类之间最弱的关系呢?这是因为依赖关系具有很大的偶然性,或者说是临时性,比如我要回家,到了地铁站,来了一辆开往我的目的地的地铁我就可以坐上,这时候就说我和这辆地铁之间是有依赖关系的,但是我下次去坐地铁的时候可能就是另外一辆地铁了,那么和我有依赖关系的就是另外一辆地铁,所以说依赖关系具有很大的偶然性。放到编写程序中来说,一个类A作为另一个类B的一个方法的参数,那么就说明类A和类B之间有依赖关系,且类B依赖于类A,依赖关系在UML类图是使用带有箭头的虚线表示,箭头指向被依赖的类,如下图所示(请原谅我电脑上没有类图,只好用电脑自带的画图工具画图了):

2.关联

  类与类之间的关联关系就比依赖关系更紧密一些,那么什么是关联关系呢?还是上面坐车回家的例子,但是现在我买了个电动自行车简称电动车回家了,我今天回家骑的是我的电动车,明天回家骑的还是我的电动车,大后天甚至大大后天都是我的小电动车,那么我和我的电动车之间就是关联关系,因为不具有随机或者偶然性(当然车被偷了不算),我和我的电动车之间的关系肯定是要比随机坐上的一辆地铁的关系是要紧密的多,此外具有关联关系的双方之间具有平等性(当然我和电动车之间不具有公平性,总不能让电动车骑我吧);在代码层面来说,被关联类A以类的属性的方式出现在类B中,也可以说是类B引用了一个类型为A的全局变量,说得通俗一点就是关联类B中有一个属性是被关联类A,关联关系使用带箭头的实线表示,UML类图如下所示:

  关联关系又可以分为多种,分别是:单向关联、双向关联、多重性关联以及自关联。

  依赖和关联的区别:

  依赖关系是一种弱的关联关系,只要一个类使用到了另一个类,那么就可以说两者之间具有关联关系,并且关联关系之间具有很大的偶然性,并不是必然的关系,但是关联关系呢就具有很明显的强依赖关系,并且具有长久性,并不是偶然的或者是随机的;

3.聚合

  聚合在某种意义上来说是另外一种关联关系,但是聚合强调的更多的是整体和局部的关系,而且是整体和局部很弱的关联关系,即使整体不存在了,局部也是可以作为单独的个体存在的,什么意思呢?还拿我们家那个电动牌自行车说事,哥们儿为了显示有钱,特意买了两辆电动车,一辆飞鸽牌的一辆飞雁牌的,今天骑这个上班明天骑那个回家,想怎么骑都行,都是我的自行车嘛,但是呢,昨天下班老婆发话了,明天你那飞鸽牌的自行车归我了,我要出去溜达一圈,得,第二天我们就一人一个电动车骑着,迎着朝阳出发了。

  有人会说,你上面扯了那么多,跟聚合有个毛线关系,小哥儿,不要着急,听我慢慢道来,如果从代码层面来说,我的自行车是不是可以看做一个对象,这个对象又包含了两个对象,一个是对象是飞鸽牌自行车,一个是飞雁牌自行车,现在我老婆拿走了一辆,拿走的那辆还是可以骑的并没有什么影响,唯一有影响的就是我的自行车只剩下一辆了,两个自行车组成的就是一个聚合对象,但是组成聚合对象的对象还是可以单独存在的,也就是说假设有聚合对象A,A对象可以包含对象B,但是B对象并不是A对象的一部分,也就是前面所说的B对象可以单独存在。

  不知道我上面说清楚了没有,简而言之就是组成聚合对象的对象,拿出来是可以作为一个单独的对象的,其在聚合对象中一般表示为集合或者说是数组形式,在UML类图中使用实线箭头和空心菱形表示:

4.组合

  上面的聚合的例子理解了的话,组合是很好理解的,因为组成组合对象的对象必然是组合对象的一部分,而且不能离开组合对象成为单独的对象;有点绕,简单来说就是你的胳膊是你身体的一部分,如果把你胳膊看了你的胳膊就不能用了,组合关系其实也是整体和部分的关系,但是这个部分是不可分割的一部分,类图与聚合一样,只不过菱形变成了实心的,考虑倒我的画图艰难,我就不再画图了。

聚合和组合的区别:

  聚合和组合其实都是整体和个体的关系,但是区别就在于聚合关系中的个体是不依赖于整体的,聚合中的个体是可以作为单独的对象存在的,但是组合不行,组合关系中的个体是依赖于整体的,如果整体不存在了,那么个体也是会消失的,组合中整体和个体之间具有相同的生命周期。

5.实现

  实现很容易理解,就是实现接口嘛,在UML类图中使用虚线加空心三角表示,从实现类指向接口类;

6.继承(泛化)

  继承也称之为泛化,这个也容易理解,就是子类继承父类,在UML类图中使用实线加上空心三角表示,从子类指向父类;

结语

  关于UML类图中的类之间的关系的学习暂时就到这里,后面有用到类图的其他方面内容了再学习;

初识UML类图--类之间关系的更多相关文章

  1. UML类图中的关系表示

    UML类图中的关系和表示方法 类图是用来描述程序中的类以及它们之间的关系的,使用类图可以帮助我们简化对系统的理解.在UML类图中比较常见的关系有六种,它们分别是:依赖.关联.聚合.组合.泛化.实现,这 ...

  2. 设计模式之UML类图的常见关系

    设计模式之UML类图的常见关系 本文来自转载 烧点饭博客 本篇会讲解在UML类图中,常见几种关系: 泛化(Generalization),依赖(Dependency),关联(Association), ...

  3. 转 UML类图几种关系的总结

    UML类图几种关系的总结   在UML类图中,常见的有以下几种关系: 泛化(Generalization),  实现(Realization),关联(Association),聚合(Aggregati ...

  4. UML类图的常见关系1

    设计模式之UML类图的常见关系(一)   本篇会讲解在UML类图中,常见几种关系: 泛化(Generalization),依赖(Dependency),关联(Association),聚合(Aggre ...

  5. UML类图几种关系的总结(网摘)

    Source link:http://www.open-open.com/lib/view/open1328059700311.html UML类图几种关系的总结 原文出处:[深度开源] 在UML类图 ...

  6. 【转载】UML类图几种关系的总结

    因为有的时候很久不弄UML图,老是忘记几个常见的连接线的意思,这篇完全说转载:UML类图几种关系的总结 在UML类图中,常见的有以下几种关系: 泛化(Generalization),  实现(Real ...

  7. 2.java面向对象类与类/类与对象之间关系详解

    继承.实现.依赖.关联.聚合.组合的联系与区别 下面的内容很基础,同时也很简单,但是也很重要. 继承 指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口)的功能,并可以增加它自己的新功 ...

  8. UML类图五种关系与代码的对应关系

    转: UML类图中的五种关系的耦合强弱比较:依赖<关联<聚合<组合<继承 一.依赖关系: (一)说明 虚线+箭头 可描述为:Uses a 依赖是类的五种关系中耦合最小的一种关系 ...

  9. [UML][转]UML类图符号 各种关系说明以及举例

    修改自:http://www.cnblogs.com/duanxz/archive/2012/06/13/2547801.html UML中描述类和类之间相互关系的方式包括:依赖(Dependency ...

随机推荐

  1. 《Entity Framework 6 Recipes》中文翻译系列 (12) -----第三章 查询之使用SQL语句

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-2使用原生SQL语句更新 问题 你想在实体框架中使用原生的SQL语句,来更新底层 ...

  2. 搭建LNAMP环境(三)- 源码安装Apache2.4

    上一篇:搭建LNAMP环境(二)- 源码安装Nginx1.10 1.yum安装编译apache需要的包(如果已经安装,可跳过此步骤) yum -y install pcre pcre-devel zl ...

  3. EditText中imeOptions属性使用及设置无效解决

    虽然通常输入法软键盘右下角会是回车按键 但我们经常会看到点击不同的编辑框,输入法软键盘右下角会有不同的图标 点击浏览器网址栏的时候,输入法软键盘右下角会变成“GO”或“前往” 而我们点击Google搜 ...

  4. mac下tomcat的安装与配置

    1.到 apache官方主页 下载 Mac 版本的完整 tar.gz文件包.解压拷贝到 /Library目录下,并命名为Tomcat,其他目录也可.   2.修改目录权限 到终端输入 sudo chm ...

  5. 开源地图SharpMap源码解析-(1)简介

    1.简介 SharpMap最新版基于.NET Framework 4,采用C#开发的地图渲染引擎,非常易于使用.我这次研究的是比较稳定发布的V1.1版本.可以在GitHub下载该源码,地址:https ...

  6. sizzle分析记录:词法分析器(tokenize)

    词法分析器(tokenize)? 词法分析器又称扫描器.词法分析是指将我们编写的文本代码流解析为一个一个的记号,分析得到的记号以供后续语法分析使用. sizzle引入了tokenize这个概念,意义? ...

  7. invalidate()和postInvalidate() 的区别及使用

    Android提供了Invalidate方法实现界面刷新,但是Invalidate不能直接在线程中调用,因为他是违背了单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中 ...

  8. 我被比特币撞了一下腰——记OKCoin试用体验

    本博客还有大量的.NET开源技术文章,您可能感兴趣: 1.开源Math.NET基础数学类库使用系列文章:链接 2.开源C#彩票数据资料库系列文章:链接 3.开源的.NET平台ORM组件文章:链接 4. ...

  9. Android okHttp网络请求之Retrofit+Okhttp+RxJava组合

    前言: 通过上面的学习,我们不难发现单纯使用okHttp来作为网络库还是多多少少有那么一点点不太方便,而且还需自己来管理接口,对于接口的使用的是哪种请求方式也不能一目了然,出于这个目的接下来学习一下R ...

  10. Oracel_子查询

    SQL子查询 子查询语法 SELECT select_list FROM table WHERE expr operator (SELECT select_list FROM table) 子查询 ( ...