持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情
定义类与类之间的交互关系
类与类之间都有哪些交互关系呢?UML 统一建模语言中定义了六种类之间的关系。它们分别是:泛化、实现、关联、聚合、组合、依赖。关系比较多,而且有些还比较相近,比如聚合和组合,接下来我就逐一讲解一下。
泛化
可以简单理解为继承关系。
public class A { ... }
public class B extends A { ... }
实现
实现(Realization)一般是指接口和实现类之间的关系
public interface A {...}
public class B implements A { ... }
聚合
聚合(Aggregation)是一种包含关系 ,A 类对象包含 B 类对象,B 类对象的生命周期可以不依赖 A 类对象的生命周期,也就是说可以单独销毁 A 类对象而不影响 B 对象,比如课程与学生之间的关系。
//可以看到聚合中B是外部传入的,因此B对象的生命周期是依赖外部的而不是A类,
//A类只是持有B类的引用
public class A {
private B b;
public A(B b) {
this.b = b;
}
}
组合
组合(Composition)也是一种包含关系。A 类对象包含 B 类对象,B 类对象的生命周期依赖 A 类对象的生命周期,B 类对象不可单独存在,比如鸟与翅膀之间的关系。
//可以看到对于组合来说,B类对象的生命周期和A类一致。
public class A {
private B b;
public A() {
this.b = new B();
}
}
关联
关联(Association)是一种非常弱的关系,包含聚合、组合两种关系。具体到代码层面,如果 B 类对象是 A 类的成员变量,那 B 类和 A 类就是关联关系
public class A {
private B b;
public A(B b) {
this.b = b;
}
}
或者
public class A {
private B b;
public A() {
this.b = new B();
}
}
依赖
依赖(Dependency)是一种比关联关系更加弱的关系,包含关联关系。不管是 B 类对象是 A 类对象的成员变量,还是 A 类的方法使用 B 类对象作为参数或者返回值、局部变量,只要 B 类对象和 A 类对象有任何使用关系,我们都称它们有依赖关系。
public class A {
private B b;
public A(B b) {
this.b = b;
}
}
或者
public class A {
private B b;
public A() {
this.b = new B();
}
}
或者
public class A {
public void func(B b) { ... }
}
从更加贴近编程的角度,对类与类之间的关系做了调整,只保留了四个关系:泛化、实现、组合、依赖, 这样你掌握起来会更加容易。也就是把组合,聚合,关联全看成了组合。更贴近组合优于继承。