目录
前言
UML类图用来表示类与类之间的关系,是一种静态图(区别于对象图,对象图描述的是某一时刻对象与对象之间的关系)。能够理解UML类图,是学习设计模式的基础,看懂了类图,就能够更好的理解设计模式,学习起来事半功倍。
一、UML类图如何表示一个类?
一个类图从上到下的矩形分别表示类名、 属性、方法,在属性和方法前面的+ - # ~ 表示如下表所示:
符号 | 含义 |
---|---|
+ | public,公开的,所有的类均可访问 |
- | private,私有的,仅本类可访问 |
# | protected,受保护的,本包类、子类可访问 |
~ | default,包的,本包类可访问、子类不可访问 |
注意,如果一个类的名称是斜体字,则该类就是抽象类。
类图除了能够表示一类之外,还可以表示一个接口,接口从上到下的矩形分别表示接口名称和接口方法。类图表示接口通常有两种表示方法,第一种在类名上添加<<interface>>,表明这是一个接口,如下图所示。
另外一种表示方法俗称为‘棒棒糖表示法’,在类图上添加一个类似与棒棒糖的图示,如下图所示。
二、UML类图如何表示类与类之间的关系?
UML类图,类与类之间的关系如下表所示。
关系 | 含义 | 符号表示 |
---|---|---|
继承 | 一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。谁指向谁表明谁继承了谁。继承有一般也用泛化表示,继承是泛化的一种表现形式,泛化一般表现为继承或者实现。继承符号表示为实线三角箭头。 | |
实现 | 一种类与接口的关系,表示类是接口所有特征和行为的实现。谁指向谁表明谁实现了谁。实现符号表示为虚线三角箭头。 | |
关联 | 一种拥有的关系,它使一个类知道另一个类的属性和方法。关联分为单向关联和双向关联,用实线和实线箭头分别表示双向关联和单向关联。 | |
聚合 | 整体与部分的关系,且部分可以离开整体而单独存在。聚合是关联的一种特殊形式,是一弱的关联。用菱形空心表示聚合符号。 | |
组合 | 整体与部分的关系,但部分不能离开整体而单独存在。组合也是关联的一种特殊形式,是一种强关联。用菱形实心表示组合关系。 | |
依赖 | 一种使用的关系,即一个类的实现需要另一个类的协助。用虚线箭头表示依赖关系。 |
UML图示样例如下图所示。
1、继承关系如何用代码表示
public class Animal{
.......
}
public class Bird extends Animal{//使用关键字extends表明Bird类继承了Animal类
}
在Java语言中,使用extends 表明继承关系。鸟是动物的一种,所以鸟继承了动物。
2、实现关系如何用代码表示
public interface Fly{
...
}
public class Goose implements Fly{//使用implements关键字表明大雁类实现了飞翔接口
...
}
在Java语言中,使用interface表明谁实现了谁。
3、关联关系如何用代码表示
public class Penguin{
puiblic Climate climate;//定义一个气候类,与企鹅类关联
......
}
public class Climate{
......
}
在企鹅类中定义了气候类,那么企鹅类就关联了气候类,这时候企鹅类知道气候类的变化,如果一个类中定义了另外一个类,这个类了解另外一个类的变化,并且是类的属性的一部分(整体与部分的关系),我们叫做类与类的关联关系。
4、聚合关系如何用代码表示
public class GooseGroup{
List<Goose> gooseList;//定义一个大雁list
public void addGoose(Goose gooses){//雁群添加大雁,大雁也可以离开雁群
this.gooseList.add(gooses);
}
}
public class Goose interface Fly{//使用interface关键字表明大雁类实现了飞翔接口
...
}
从代码中我们可以看到,GooseGroup(雁群)对象与Goose(大雁)对象是一个1对多的关联关系,但是大雁的生命周期不是在雁群里面产生的(没有在雁群里面new),从外部传入,即大雁的生命周期是不受雁群影响的,GooseGroup(雁群)对象没有了(置为null)Gooses(大雁)对象不受影响,依旧可以在外部使用Goose对象。聚合关联是关联关系的一种特殊形式,但类与类之间关系还没有这么紧密,各自拥有各种的生命周期。
5、组合关系如何用代码表示
public class Bird{
public Wing leftWing;
public Wing rightWing;
public Bird(){
//鸟在创建的时候就拥有翅膀
leftWing = new Wing();
rightWing = new Wing();
}
}
public class Wing{
....
}
从代码中我们可以看到,Bird(鸟)对象中的Wing(翅膀)对象定义在Bird(鸟)对象的构造函数中,即Bird(鸟)对象在诞生时就拥有两个Wing(翅膀)对象,鸟类消亡时(置为null)时,Wing(翅膀)对象也无法在外部继续使用,随着Bird(鸟)对象消亡。组合关系也是关联关系的一种特殊形式,但是他们之间的关联更加紧密,拥有相同的生命周期。
6、依赖关系如何用代码表示
public class Animal{
....
public void metabolism(O2 o2,Water water){/动物依赖氧气和水才能新陈代谢
.....
}
public void eat(){
Food food = new Food();//动物吃东西依赖食物
}
}
public class O2{
...
}
public class Water{
...
}
public class Food(){
...
}
从代码中可以看到,Animal(动物)对象在进行metabolism(新陈代谢操作)时,需要依赖O2(氧气)对象和Water(水)对象才能完成;Animal(动物)在进行进食操作时依赖Food对象才能完成。类的依赖关系表明了类进行一个操作依赖了另外一个类才能完成,即被依赖的类都在都是局部变量类,他不是类的一部分(不是类的属性,如果为类的属性就是关联关系),类的操作需要另外一个类协助。
设计模式七大原则
设计模式七大原则如下表所示:
原则 | 简单概念 |
---|---|
开闭原则 | 一个类应该对修改关闭,对扩张开放,避免修改已经稳定的类,而是对类进行扩张 |
单一职责 | 类的功能职责应该单一,不要把太多职责放到类中。 |
依赖倒置原则 | 高层模块不应该依赖低层模块,它们都应该依赖抽象。抽象不应该依赖于细节,细节应该依赖于抽象。 |
接口隔离原则 | 客户端不应该依赖那些它不需要的接口。一旦一个接口太大,则需要将它分割成一些更细小的接口,使用该接口的客户端仅需知道与之相关的方法即可。 |
里氏替换原则 | 一个父类可以出现的地方,子类必定可以出现。 |
迪米特法则 | 即最小知识原则,每一个对象都对其他对象保持最小了解。 |
合成复用原则 | 尽量使用对象组合,而不是继承来达到复用的目的。 |
总结
学习UML类图,能够看懂UML类是学习设计模式的基础。能够看懂UML类图,对于理解记忆设计模是事半功倍的。重点要记住UML类图的符号表示以及各种UML类图之间类与类之间的关系,一看到UML图脑海中能够映射出响应的代码结构。