UML类图是什么
类图在UML的9个图中占据了一个相当重要的地位。James Rumbaugh对类的定义是:类是具有相似结构、行为和关系的一组对象的描述符。类是面向对象系统中最重要的构造块。类图显示了一组类、接口、协作以及他们之间的关系。在UML中问题域最终要被逐步转化,通过类来建模,通过编程语言构建这些类从而实现系统。类加上他们之间的关系就构成了类图,类图中还可以包含接口、包等元素。
什么要学习类图呢?因为类图很好的反映了我们的类与接口之间的关系,有助于我们理解设计模式的代码结构。现在像idea这样的开发工具就可以直接查看类的UML类图,学好类图也有助于我们查看框架的源码。
类的UML表示
首先推荐几个常用的画UML图的工具:Rose,Viso,processon。
类的命名尽量应用领域中的术语,应明确、无岐义,以利于相互交流和理解。类的属性、操作中的可见性使用+、#、-分别表示public、protected、private。第一行表示类名,第二行表示属性,第三行表示操作方法。如果类名为斜体,则表示抽象类。
接口的表示形式与类相似,只不过最上面通过<<interfact>>表示这是一个接口,下面是接口名,也可以添加属性和方法。
类之间的关系
类之间的关系是类图中比较复杂的内容。有关联、聚合、组合、泛化、依赖、实现。
各种关系的强弱顺序:泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖
下面是从网上找的一张图,这张图里面包含了这几种关联关系。
下面再分别对这几种关系简单介绍一下。
泛化(Generalization)
泛化定义了一般元素和特殊元素之间的分类关系,类之间的这种泛化关系也就是继承关系。泛化关系是“a-kind-of”关系,定义一般元素和特殊元素之间的分类关系。在我们所示的图中,就是鸟是一种动物。
表现方式:带空心三角形箭头的实线,箭头朝向父类。
代码体现:在Java中表现形式就是 extends 关键字。
实现(Realization)
实现关系是类与接口的关系,表示类是接口所有特征和行为的实线。在我们所示的图中,就是大雁实现了飞翔的接口,也具有了飞的能力。
表现方式:带空心三角形箭头的虚线,箭头朝向接口。
代码体现:Java中表现形式为implements关键字。
关联(Association)
是一种拥有的关系,它使一个类知道另一个类的属性和方法;如:老师与学生,丈夫与妻子关联可以是双向的,也可以是单向的。在我们所示的图中,就是企鹅生长跟气候有很大的关联。
表现方式:双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头,箭头指向被拥有者。
代码体现:成员变量。
企鹅类中包含有气候的成员变量。
public class Penguin extends Bird{
private Climate climate;
}
关联关系还可以通过数字表示如下
学生和老师的关联关系是多对多双向关联,一个老师可以有多个学生,一个学生也可以有多个老师
学生和课程是一对多单向关联,一个学生可以学习多门课。
聚合(Aggregation)
聚合是一种特殊的关联,聚合表示整体与部分的关系。且部分可以离开整体而单独存在。如车和轮胎是整体和部分的关系,轮胎离开车仍然可以存在。在我们所示的图中,就是一群大雁组成了雁群,但是大雁脱离了雁群还是照样存在的。
表现方式:带空心菱形的实心线,菱形指向整体
代码体现:成员变量。
在代码中表现如下
public class WideGooseAggregate{
private List<WideGoose> gooseList;
public WideGooseAggregate(List<WideGoose> gooseList) {
this.gooseList = gooseList;
}
}
组合(Composition)
组合也是一种特殊的关联,也表示类之间整体和部分的关系,但是组合关系中部分和整体具有统一的生存期。一旦整体对象不存在,部分对象也将不存在。部分对象与整体对象之间具有共生死的关系。在我们所示的图中,就是鸟是由翅膀、头、身体等组成的,必须要先用这些身体的部位,才可以组成鸟,而鸟没有了,那些部分也就不存在了。
表现方式:带实心菱形的实线,菱形指向整体
代码体现:成员变量。
在代码中表现如下:我们看到和聚合的区别,聚合中成员变量参数是可以通过构造方法传进去的,而组合中必须先new出来翅膀,也就是必须现有部分,才会有整体,整体不存在了,部分也就没有了。
聚合和组合的区别:聚合关系是“has-a”关系,组合关系是“contains-a”关系;聚合关系表示整体与部分的关系比较弱,而组合比较强;聚合关系中代表部分事物的对象与代表聚合事物的对象的生存期无关,一旦删除了聚合对象不一定就删除了代表部分事物的对象。组合中一旦删除了组合对象,同时也就删除了代表部分事物的对象。
public class Bird{
private Wing wing;
public Bird() {
this.wing = new Wing();
}
}
依赖(Dependency)
是一种使用的关系,即一个类的实现需要另一个类的协助,所以要尽量不使用双向的互相依赖。比如图中动物新陈代谢需要依赖于氧气和水等资源。
表现方式:带箭头的虚线,指向被使用者
代码体现:成员变量。
在代码中提现如下
public abstract class Animal{
public metabolism(Oxygen oxygen,Water water){
}
}
参考《大话设计模式》