前言

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

类与类之间的关系

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

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. shell使用攻略

    shell 是什么 ~ $ ls /bin/*sh /bin/bash /bin/csh /bin/ksh /bin/sh /bin/tcsh /bin/zsh 是什么 kernel shell 命令 ...

  2. Chrome开发者工具不完全指南(五、移动篇)

    前面介绍了Chrome开发者工具的大部分内容工具,现在介绍最后两块功能Audits和Console面板.一.Audits Audits面板会针对目前网页提出若干条优化的建议,这些建议分为两大类,一类是 ...

  3. Angular1还是Angular2

    Angular1还是Angular2 学完angular1,尝试去看了下angular2,虽然号称更强更快,可是这基于ES6和TypeScript的全新框架让人完全招架不住,而且我只是需要angula ...

  4. JavaScript必须了解的知识点总结。

    整理的知识点不全面但是很实用. 主要分三块: (1)JS代码预解析原理(包括三个段落): (2)函数相关(包括 函数传参,带参数函数的调用方式,闭包): (3)面向对象(包括 对象创建.原型链,数据类 ...

  5. FreeBSD_11-系统管理——{Part_8 - IPFW}

    内核支持 方式一:静态編译进内核 options IPFIREWALL # enables IPFW options IPFIREWALL_VERBOSE # enables logging for ...

  6. OleDb Source component 用法

    OleDb Source component 主要是从DB中获取数据,传递给下游组件,OleDb Source component的强大之处在于 query data 的mode有四种,如图 Tabl ...

  7. OpenCASCADE Conic to BSpline Curves-Hyperbola

    OpenCASCADE Conic to BSpline Curves-Hyperbola eryar@163.com Abstract. Rational Bezier Curve can repr ...

  8. Python标准模块--linecache

    1.模块简介 linecache主要用于缓存文件内容,如果下次继续读取该文件,则不需要打开文件,直接在缓存中获取该文件内容. 2.模块使用 模块的基本方法有getline,clearcache,get ...

  9. ASP.NET MVC5 网站开发实践(二) Member区域–管理列表、回复及删除

    本来想接着上次把这篇写完的,没想到后来工作的一些事落下了,放假了赶紧补上. 目录: ASP.NET MVC5 网站开发实践 - 概述 ASP.NET MVC5 网站开发实践(一) - 项目框架 ASP ...

  10. Android实现播放视频

    转载:http://www.bdqn.cn/news/201311/12100.shtml 使用VideoView播放视频 VideoView,用于播放一段视频媒体,它继承了SurfaceView,位 ...