UML 类图中最常见的几种关系有:泛化(Generalization)、实现(Realization)、组合(Composition)、聚合(Aggregation)、关联(Association)和依赖(Dependency)。这些关系的强弱顺序为:泛化=实现 > 组合 > 聚合 > 关联 > 依赖。
泛化关系
泛化(Generalization)是一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。
UML泛化(generalization)关系表示法为:空心三角形+实线。用mermaid表示为A <|-- B
。
例如:哺乳动物具有恒温、胎生、哺乳等生理特征,猫和牛都是哺乳动物,也都具有这些特征,但除此之外,猫会捉老鼠,牛会耕地。
用Java语言表示为
java
public class Cat extends MammalAnimal{
...
}
public class Cattle extends MammalAnimal{
...
}
实现关系
实现(realization)是一种类与接口的关系,表示类是接口所有特征和行为的实现。
UML实现(realization)关系表示法为:虚线+空心三角形。用mermaid表示为A..|>B
(A实现了B)。
例如:蝙蝠也是哺乳动物,它除具有哺乳动物的一般特征之外,还会飞,我们可以定义一个IFlyable的接口,表示飞行的动作,而蝙蝠需要实现这个接口。
用Java语言表示为
java
public interface IFlyable{
void flying()
}
public class Bat implements IFlyable{
@Override
void flying(){
...
}
}
组合关系
组合(composition)也表示整体与部分的关系,但部分离开整体后无法单独存在。因此,组合与聚合相比是一种更强的关系。
UML组合(composition)关系表示法为:实心菱形+实线。用mermaid表示为:A *--B
(B是A的一部分)。
例如:我们的电脑由CPU、主板、硬盘、内存组成,电脑与CPU、主板、硬盘、内存是整体与部分的关系,但如果让CPU、主板等组件单独存在,就无法工作,因此没有意义。
用Java语言表示为
java
public class Computer{
private Cpu cpu;
private Mainboard mainboard;
private HardDisk hardDisk;
private Memery memery;
public Computer(){
cpu=new Cpu();
mainboard=new Mainboard();
hardDisk=new HardDisk();
memery=new Memery();
}
}
Computer类在实例化之前一定要先实例化其他部分。
聚合关系
聚合关系表示一种弱的拥有关系,即A对象可以拥有B对象,但B对象不是A对象的一部分。
聚合(aggregation)关系的UML表示法为:空心菱形+实线箭头。用mermaid表示为A o--> B
。
从逻辑上来说,停车场中有汽车,但汽车并不是停车场的一部分。汽车和停车场之间没有部分和整体之间的关系。
用Java语言表示为
java
public class Parking{
private List<Car> carList;
public Parking(){
}
}
Parking可先实例化,carList可有可无。
关联关系
实体之间的一个结构化关系表明对象之间是相互连接的。箭头可选,没有箭头则表示双向的关联关系,单箭头表示单向的关联关系。
UML关联(association)关系表示法为:实线+箭头。用mermaid表示为A --> B
。
例如:Employee可以有0个或更多的TimeCard对象。但是,每个TimeCard只从属于单独一个Employee。
用Java语言表示
java
public class Employee{
private TimeCard _tc;
public void maintainTimeCard(){
...
}
}
依赖关系
对于两个相对独立的对象,当一个对象负责构造另一个对象的实例,或者依赖于另一个对象的服务时,这两个对象之间主要体现为依赖关系。依赖关系具体表现在局部变量、方法的参数,以及对静态方法的调用上。
UML依赖(dependency)关系表示法为:虚线+箭头。用mermaid表示为A ..> B
(A依赖于B)。
例如:动物有几大特征,如新陈代谢、繁殖、有生命。而动物要有生命力,就需要氧气、水及食物,也就是说,动物依赖于氧气和水。
用Java语言表示为
java
public abstract class Animal{
public String Metabolism(Oxygen oxygen, Water water){
...
}
}
参考资料
- mermaid语法之类图
- Java面向对象程序设计(第3版)
- 人人都懂设计模式:从生活中领悟设计模式(Python实现)