UML 类图常见关系总结
UML 中常见的关系类型如下:
- 泛化 - Generalization
- 实现 - Realization
- 关联 - Association
- 聚合 - Aggregation
- 组合 - Composition
- 依赖 - Dependency
1、泛化 (Generalization)
【泛化关系】继承关系,用于描述父类与子类间的关系。
【图标标示】带空心三角形箭头的实线,由子类指向父类。
上图中,鸟类继承于动物类,利用代码描述则如下:
//父类
class Aminal {
public $life;
public function breed () {
echo "繁殖";
}
}
//子类
class Bird extends Aminal {
public $feather;
public function layEggs () {
echo "产蛋";
}
}
2、实现 (Realization)
【实现关系】一种类与接口的关系,表示类是接口所有特征和行为的实现。
【图标标示】带空心三角形箭头的虚线,箭头指向接口。
上图中,大雁类实现飞翔接口的操作,利用代码描述则为:
interface Fly {
public funtion fly ();
}
class WildGoose implements Fly {
public function fly () {
echo "飞翔";
}
public function layEggs () {
echo "下大雁蛋";
}
}
3、关联 (Association)
【关联关系】一种拥有关系,指一个类知道另一个类的属性和方法。
【代码体现】通常将一个类的对象作为另一个类的成员变量。
【图标标示】用实线连接有关联关系的对象所对应的类。可以是有双向箭头、单向箭头或者没有箭头的实线。
下图中,企鹅拥有地点类,地点作为栖息地,是企鹅类的属性。
上述图用代码描述则为:
public class Penguin {
private Place home;
...
}
public class Place {
public char name;
...
}
上述实际上是单向关联,其实还有双向关联、自关联、多重关联几个概念。
双向关联
默认情况下,关联是双向的。例如顾客购买商品并拥有商品,反之,卖出的商品总有某个顾客与之关联。
自关联
系统中可能存在一些类的属性对象为该类自身,这种特殊的关联关系称为自关联。例如一个节点类(Node)的成员又是节点 Node 类型的对象。
多重关联
多重性关联关系表示两个关联对象在数量上的对应关系。在 UML 中,对象之间的多重性可以直接在关联直线上用一个数字或一个数字范围表示。
对象间的多重性关联关系表示方法如下表所示:
表示方式 | 多重性说明 |
---|---|
1..1 | 表示另一个类的一个对象只与该类的一个对象有关系 |
0..* | 表示另一个类的一个对象与该类的零个或多个对象有关系 |
1..* | 表示另一个类的一个对象与该类的一个或多个对象有关系 |
0..1 | 表示另一个类的一个对象没有或只与该类的一个对象有关系 |
m..n | 表示另一个类的一个对象与该类最少m,最多n个对象有关系(m <= n) |
4、聚合关系
【聚合关系】整体与部分的关系,且部分可以离开整体单独存在。如雁群和大雁,大雁离开雁群仍可以存在。
【代码体现】成员对象通常作为构造方法、Setter方法或者业务方法的参数注入到整体对象中。
【图标标示】带空心菱形的实心线,菱形指向整体。
上述大雁与雁群的聚合关系,用代码表示则如下:
//雁群
class WildGooseGroup {
private $wildGooseArray;
//采用构造函数参数注入大雁
public function __construct (WildGoose $wildGoose) {
$this->wildGooseArray[] = $wildGoose;
}
}
//大雁
class WildGoose implements Fly {
public function fly () {
echo "飞翔";
}
public function layEggs () {
echo "下大雁蛋";
}
}
5、组合关系
【组合关系】整体与部分的关系,但是部分不能离开整体而单据存在。如鸟和翅膀一样,没有了鸟就没有翅膀。
【代码体现】通常在整体类的构造方法里直接实例化成员类。
【图标标示】带实心菱形的实线,菱形指向整体。
上述鸟与翅膀的组合关系,利用代码描述则如下:
//鸟
class Bird extends Aminal {
public $feather;
public $winds;
public function __construct () {
//类的构造函数里直接实例化
$this->winds[] = new Wind();
$this->winds[] = new Wind();
}
public function layEggs () {
echo "产蛋";
}
}
//翅膀
class Wind {
...
}
6、依赖关系
【依赖关系】一种使用的关系,即一个类的实现需要另一个类的协助,要尽量不要使用双向的互相依赖。
【代码体现】局部变量、方法的参数或者对静态方法的调用。
【图标表示】带箭头的虚线,指向被使用者。
上述依赖关系,利用代码表示则如下:
class Aminal {
public $life;
public function breed () {
echo "繁殖";
}
//通过方法的参数产生依赖
public function breed (Water $water, Air $air) {
echo "新陈代谢";
}
}
class Water {
...
}
class Air {
...
}
7、总结
组合与聚合实际上是关联关系中的两种。关联关系的强弱如下:
泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖
下面这 UML 图,比较形象的展示了各种类关系:
参考
UML类图几种关系的总结
深入浅出UML类图
上述所有图片均采用 Enterprise Architect 绘制,感兴趣的可以研究下。