Logo
Published on

设计模式,一个时空视角

Authors
  • avatar
    Name
    浩森 Hansen
    Twitter

最近抽空把设计模式的基本概念做了下整理。

为什么抽空去整理一个大学知识?因为我在编程实践过程中,发现设计模式真的是无处不在。

例如:

  • “代理模式”在前端编程中,经常作为数据变更的跟踪器使用。
  • “发布订阅模式”被消息队列等中间件借鉴。
  • “拦截过滤器模式”应用在 HTTP 服务器对请求的过滤操作。

设计模式是编程中的“最佳实践”,是经验和套路,了解这些概念之后,利用 AI 编程的效率也会更高。

设计模式的核心目的是:“解耦”,令复杂系统可维护。

而在这次的整理过程中,我找到了一个全新的理解视角:时空视角

时空视角

宇宙大爆炸之后,时空诞生。世界上很多事情都可以用时空来理解:人的情绪被环境和时间所影响;历史和地理,也是人类社会的时间和空间角度。

正因为世界是由三维空间和时间轴组成的,所以时空,是一个具有通用性的认知角度。“设计模式”也不例外。

设计模式中的时空视角

我把以上视角拆分开来,分别对应了三类设计模式:

  • 宇宙的大爆炸 - 创建型模式
  • 空间角度 - 结构型模式
  • 时间角度 - 行为型模式

宇宙的太初:创建型模式

如何创建对象?

一个程序就像一个宇宙,先创建必要的元素,才能执行特定功能。

创建型模式有以下几种:

  • 工厂模式:用字符串作为参数,完成对象的初始化。本质上是字符串到对象的单向映射。
  • 单例模式:每一个对象,都只能被初始化一次。就像世界上只有一个独一无二的“你”。
  • 建造者模式:设定一个“蓝图”,对象根据蓝图中提供的信息,一步一步构建一个完成的复杂对象。
  • 原型模式:使用一个“花名册”,里面保存了所有的对象的单一实例,当需要时,从花名册中“克隆”对象出来使用。体现了缓存思想。
  • 享元模式:也用“花名册”,不同的是,从花名册中取出对象不经过“克隆”,而是直接来用。并且可以多次取用同一对象,大家“共享元素”。

空间:结构型模式

如何定义对象之间的关系?

就像公司的组织架构,复杂的程序一定有其内部结构。

结构型模式有以下几种:

  • 适配器模式:保留系统已有功能,利用“补丁”,让原有程序可以接入新的其他系统。就像“旅行用插座转接器”一样。
  • 装饰器模式:利用“补丁”,在原有程序的基础上,加入新功能。
  • 代理模式:为一个对象 A 创建代理人 B,我们不直接操作 A,而是通过 B 间接操作 A。就像是明星经纪人一样。
  • 外观模式:为一个黑盒系统,定义外部可以访问的接口。就像是 IPhone 手机的触摸屏,我们的手只操作触摸屏,而不直接操作手机内部的电子元件。
  • 桥接模式:为一个系统创建一整套 API 作为“桥”交给外部系统使用,操作“桥”,就是操作系统。就像系统提供了一套“工具箱”,里面有锤子和螺丝刀,我们用工具来访问系统。
  • 组合器模式:允许对象自己嵌套自己。有点像套娃,不过组合器模式可以一层里面套多个对象,形成一个结构。

时间:行为型模式

如何定义对象行为?

程序执行自有其逻辑,大型复杂程序更是。行为型模式给了我们一些思路,让对象之间的交互更有序。

行为型模式有以下几种:

  • 策略模式:允许对象根据不同的情况采取不同的执行逻辑。“因地制宜”。
  • 模版模式:先总后分,先定义好逻辑的大框架“模版”,然后再定义不同的细分执行步骤。
  • 观察者模式:像一个监控,A 监控 B。当 B 改变时 A 立即被通知
  • 发布订阅模式:类似于观察者模式,但多了个“中间人”。当 B 状态改变时推送消息给中间人,A 从中间人那里获取数据。有了中间人,A 和 B 之间可以是多对多的关系。
  • 拦截过滤器模式:在对一个对象操作之前,先“拦截”下来做些其他的必要处理,然后再操作对象。就像“海关”,在入关时要对进口包裹开箱检查和征税。
  • 迭代器模式:假设有一串数据,设计一个迭代器来按照一定顺序访问该数据,而无需知道数据的内部结构。这是计算机的“迭代”思想。
  • 责任链模式:把处理器串成一串“链”,当请求进入时,请求被放到链条上挨个询问处理器,直到有一个认领后处理。像一条流水线。
  • 命令模式:把“指令”封装成对象,将指令传达到目的地后处理。
  • 备忘录模式:把“操作过程”封装成对象,然后记录下来,就是”备忘录“。这样就可以查询和回退操作。
  • 状态模式:一个环境里面有多个状态,当状态改变时,环境也跟着改变。
  • 访问者模式:数据和操作分离,把数据当作“房间”,操作当作“访问人员”。访问人员可以进入不同的房间操作里面的数据。
  • 中介者模式:聊天室模式。聊天室作为中介,大家在其中发言,遵循的是同一套方法。“中介”定义了在某个环境下的“规则”,大家都必须遵循。
  • 解释器模式:比较少用到,一般用于编程语言的执行器。处理语法规则。