设计模式:关系
设计模式
1 关系
关联 & 依赖
- 依赖 表示一种
使用
关系,一个类的实现需要另一个类的协助,因此尽量使用单向的依赖。代码表现为参数依赖、局部变量、静态方法/变量依赖等 - 关联 偏向一种
拥有
关系,A 拥有 B,即 A 的某个成员,是 B 类的对象,也可以双向拥有,也可以仅仅是存在一种关联
classDiagram
direction LR
class Car {
+run() void
}
class Driver {
+Car car
+drive() void
}
Driver "1"-->"n" Car
class Bus {
+run() void
}
class BusDriver {
+drive(bus:Bus) void
}
class Passenger {
}
BusDriver ..> Bus
Bus "n"--"n" Passenger
依赖强调一方要使用另一方、依赖另一方而存在
-
司机拥有了汽车,二者存在关联。
-
公交司机使用公交车进行开车工作,他依赖公交车,但是不拥有公交车。
-
乘客与公交车之间互不依赖互不拥有,但是他们之间确实存在多对多的关系
动物依赖氧气而活,这是依赖关系。动物活着也会与气候发生关系,但是动物不是直接依赖气候而活,因此是关联关系。公交司机之所以是公交司机,是因为有公交车存在,这是依赖关系。
组合 & 聚合
聚合和组合都是强调整体与部分的关系
,也都可以视为一种关联
关系
- 组合 是一种
强拥有
关系,部分组装成整体,失去了整体,组装的零件也就没有了存在的意义 - 聚合 是一种
弱拥有
关系,部分聚集成整体,但是整体解散了部分存在依然有意义
classDiagram
direction LR
class Bird {
- Wing[2] wings
+ fly():void
}
class Wing {
- double size
}
Bird "1"*--"2" Wing : 组合关系
class Class {
+ Student** stus
}
class Student {
- string name
}
Class "1"o--"n" Student : 聚合关系
聚合的部分可以脱离整体而存在,而组合的部分不能脱离整体而存在
- 翅膀是鸟的组成部分,脱离了鸟,翅膀便不是一个完整的功能部分
- 学生是班级的组成部分,班级解散了,不影响这批学生存在的意义
二者与关联关系的区别就在于,聚合与组合,更强调整体与部分之间的关系。鸟与翅膀、班级与学生之间自然存在关联,但他们之间有更进一步的整体部分关系,而非仅仅是关联关系。
泛化 & 实现
- 泛化/继承 是一种类之间的关系,子类继承父类属性和方法,各自有自己的新特性,父类是子类的泛化。
- 实现 是
接口与实现类
之间的关系。接口是一种抽象的规范,定义了一组方法的签名。一个类通过实现接口来表明它提供了接口中定义的所有方法。实现关系使得类之间的依赖基于接口而不是具体的实现。
classDiagram
direction BT
class Person {
# string name
+ eat():void
}
class Student {
- string sid
+ work():void
}
class Teacher {
- string tid
+ work():void
}
Student --|> Person
Teacher --|> Person
class work {
<<interface>>
+ work():void
}
Student ..|> work
Teacher ..|> work
- 学生和老师都是人,都从 Person 那里继承了属性和方法
- 学生和老师都需要工作,工作的方式和内容五花八门,但是他们都实现了统一的接口 work
继承强调类的层次关系,上层是下层的泛化,下层是上层的派生。实现强调的是方法,即定义一组规范接口,让别的类去实现,并没有泛化派生的意味
下图是一张经典的 UML 图: