学习《设计模式》好长时间了,可是到现在还是分不太清楚几种UML中的几种关系。如果这几种关系理解的不是很透彻的话,那么会直接影响到对类图之间关系的理解,下面就来分析下几种关系吧!
类之间的关系
1.Dependency(依赖)、Relization(实现)、Generalization(泛化)
2.Association(关联)、Aggregation(聚合)、Composition(组合),这三种是一类的关联关系
依赖(Dependency)
依赖关系是这几种关系中最弱的,因为只彼此之间只是单纯的依赖,并没有增加过多的属性。
依赖关系表示,特定事物的改变会影响另一个事物,体现在某个类中的方法中使用另一个类的对象作为参数或者局部变量
用一根虚线加箭头表示,如下图所示:
依赖的表现形式
1.A类作为B类方法中的传递参数
2.A类作为B类方法中的局部变量
从上面我们也可以看出,无论是作为参数传递还是局部变量传递,A类的生命周期都是伴随着B类方法的存在而存在的,这就是依赖的关键所在。因此A类改变了,B类的方法随之改变,但是两者自始至终都没有增加多余的属性。
关联(Association)
通常表现为变量(Has a),比如我们经常说的一个部门有很多教师,可是一个教师只能属于一个部门等等。也就是我们经常见到的:“*”(表示很多),”1”(有且只有一个),”0…….”(表示0个或多个),”n……m”(两者之间是多对多的关系)
它表示在两个类之间的强依赖关系,通常表现在一个类作为另一个类的属性出现
用一根直线表示,如下图表示
单向关联
双向关联
依赖于关联的区别
1.首先从关系程度上依赖没有关联程度强烈,对于两个类之间的依赖,只是保持在方法上,例如一个类的方法中引用了某个类的变量。
2.在关联中确实彼此把对方作为自己的一个属性,耦合度更高。保持的时间更长些,毕竟是作为一个属性存在,实例化我的时候,就会有你。而依赖只是单纯的用到对方方法时才存在
关联细化
聚合的关系图如下:
组合关系图如下:
组合和聚合区别
首先从定义上说,聚合中的两个类,如上图的大雁和雁群,都可以脱离对方而单独的存在;组合确实彼此依存的,正如翅膀是大雁身体的一部分,不能脱离对方而单独存在
聚合
//雁群类 class GooseGroup { public Goose goose; //在聚合中通过参数传递,所以两者是相互独立的 GooseGroup(Goose goose) { this.goose = goose; } } //大雁类 class Goose { }
组合
//大雁类 class Goose { public Wings wings; //通过构造函数来实例化对象,这样可以做到与我同在,在有大雁的时候,就会有翅膀 Goose() { wings = new Wings(); } } //翅膀类 class Wings { }
泛化
通常就是我们所说的类与类之间的继承关系,通过继承可以实现父类里面的所有方法,并且子类还可以扩充自己。在Java中用关键字Extends,C#用:关键字
实现(Relization)
主要是针对于接口而言的,里面也包含了泛化一部分的成分所在,通常用Implement关键字,关系图如下
泛化与实现的区别
其实泛化与实现之间的关系只有一点,如实是实现的话,那么子类就不能够在扩充方法,如果是泛化的话,可以在父类基础上再次扩充自己的方法。