由于最近想学习下设计模式的相关知识,于是想通过记录的方式来整理下自己所学的相关知识。
由于设计模式中经常使用到类图来表示类与类之间的关系,因此在学习具体的设计模式知识之前,也了解下UML类图的相关知识。
一、UML(unified modeling language)又称统一建模语言或标准建模语言。类的UML表示为
其中,第一行表示类名,抽象类是用斜体表示
第二行表示类里面的所有属性
第三行表示类里面的所有方法
注:对于类的属性和方法的权限可以用+ 表示public,#表示protected,- 表示private
二、类与类之间的关系
在UML类图中,类不会单独存在,每个类之间有着这样或那样的关系。这些类之间的常用关系可以有:继承(也叫泛华 Generalization)、实现(Realization)、依赖(Dependency)、关联(Association)、聚合(Aggregation)、组合(Composition)。
1,继承关系:表示的子类与父类之间的关系。
箭头表示为:带三角箭头的实线,箭头指向父类。
2、实现关系:类实现接口
箭头表示为:带三角箭头的虚线,箭头指向接口
3、依赖关系:
简单的理解就是类A使用到了类B,但是类A和类B的关系是非常弱的,表现在代码里一般是类B作为参数被类A在某个函数中使用,类B可以作为类A中的函数的参数,也可以作为函数的返回值。类B也可以是一种局部变量的形式存在于类A中
箭头表示为:带箭头的虚线,箭头指向被使用者。
4、关联关系:
关联关系表现为类与类之间的一种比较强的关系,他比依赖关系要强。比如我和我的朋友,同时,这种关系中的每个类的关系一般是平等的,关联可以是单向的也可以是双向的。表现在代码层面就是类B以属性的性质出现在类A中。即,被关联的类作为关联类的属性出现在关联类中。也就是被关联的类作为关联类的成员变量
箭头表示为:带普通箭头的实心线,箭头指向被关联类,如果是双向关联,可以使用双箭头,也可以不加箭头。同时可以在箭头中加上数字,表示关联的个数
5、聚合关系:
聚合关系是一种比关联关系更强的一种关系,主要表现为一种整体与局部的关系,好比雁群与大雁的关系就是一种聚合关系,雁群是整体,大雁是部分。但是这里的部分脱离了整体也是可以存在的,而整体是离不开部分的。也就是说大雁离开了雁群它还是大雁,而雁群没有了大雁就不是雁群了。在代码中的表现形式为,部分类作为整体类的成员变量,就代码变现形式而言,聚合关系和关联关系的表现形式是一样的。但是可以有个简单的理解就是在聚合关系中,部分类常常作为整体类的构造函数的参数(只是自己的理解,网上也有看到过,但是不知道这样理解对不对)。
箭头表示为:带空心菱形的实线箭头,菱形指向整体,箭头指向部分。
6、组合关系:
组合关系是一种比聚合关系更强的一种类与类的关系。组合关系也是一种整体与部分的关系,但是这里的整体与部分的关系比聚合之间的整体与部分的关系更为紧密。在组合关系中,整体的生命周期和部分的生命周期是一样的。整体不存在了,部分也就没有存在的意义了。比如,人和牙齿就是一种组合关系。在代码的表现形式上来看,组合关系和聚合关系是一样的额,也是部分作为整体的成员变量。但是可以有个简单的理解就是在整体的构造函数中构造部分的实体类对象。
箭头表示为:带实心的菱形箭头,菱形指向整体,箭头指向部分。
另,在网上看到过一个对于聚合关系和组合关系的说明。有个例子就是汽车与轮胎的关系。
就是说对于汽车而言,汽车和轮胎是组合关系,因为对汽车来说汽车都没有了,轮胎也就没有存在的意义了。
而对于轮胎工厂而言,汽车和轮胎就只是聚合关系,轮胎只是汽车这个整体中的一个部分而已,汽车没有了,轮胎可以继续卖。
所以,对于类与类之间到底是什么关系,还是要根据实际情况来判断。以上说的一些判断依据只是对于一般的情况而言的。
最后附上一副《大话设计模式》中的uml图,这个图可以比较完整的展示类之间的各种关系