初识UML类图--类之间关系
前言
最近有打算学习一下设计模式,所以就去看了园子里面左潇龙大哥的设计模式文章,看完之后只有一个感觉,我啥时候也能写出来这么牛逼的文章啊,但是我这语文老师死的早的人还是算了,但是设计模式还是要学的,这个博客还是要写的,所以还是接着写吧,遵从龙哥的教诲,学习设计模式之前先简单学习一下类图里面各种类的关系,因此就有了这篇随笔,废话不多说,下面进入正文。
类与类之间的关系
类与类之间的关系从弱到强依次是:没有关系(这不是扯淡嘛)、依赖、关联、聚合、组合,还有泛化(其实就是继承)和实现,这俩大哥是在是没地方排了,就随便放着吧,下面一一介绍各个关系:
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类图中的类之间的关系的学习暂时就到这里,后面有用到类图的其他方面内容了再学习;