小话设计模式

设计模式

1 关系

🔗Mermaid类图画法

关联 & 依赖

  • 依赖 表示一种使用关系,一个类的实现需要另一个类的协助,因此尽量使用单向的依赖。代码表现为参数依赖、局部变量、静态方法/变量依赖等
  • 关联 偏向一种拥有关系,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图:

UML示例

2 设计原则

posted @ 2023-06-06 15:15  开宝特攻  阅读(12)  评论(0编辑  收藏  举报
Back to Top Button