- Published on
设计模式,一个时空视角
- Authors
- Name
- 浩森 Hansen
最近抽空把设计模式的基本概念做了下整理。
为什么抽空去整理一个大学知识?因为我在编程实践过程中,发现设计模式真的是无处不在。
例如:
- “代理模式”在前端编程中,经常作为数据变更的跟踪器使用。
- “发布订阅模式”被消息队列等中间件借鉴。
- “拦截过滤器模式”应用在 HTTP 服务器对请求的过滤操作。
设计模式是编程中的“最佳实践”,是经验和套路,了解这些概念之后,利用 AI 编程的效率也会更高。
设计模式的核心目的是:“解耦”,令复杂系统可维护。
而在这次的整理过程中,我找到了一个全新的理解视角:时空视角。
时空视角
宇宙大爆炸之后,时空诞生。世界上很多事情都可以用时空来理解:人的情绪被环境和时间所影响;历史和地理,也是人类社会的时间和空间角度。
正因为世界是由三维空间和时间轴组成的,所以时空,是一个具有通用性的认知角度。“设计模式”也不例外。
设计模式中的时空视角
我把以上视角拆分开来,分别对应了三类设计模式:
- 宇宙的大爆炸 - 创建型模式
- 空间角度 - 结构型模式
- 时间角度 - 行为型模式
宇宙的太初:创建型模式
如何创建对象?
一个程序就像一个宇宙,先创建必要的元素,才能执行特定功能。
创建型模式有以下几种:
- 工厂模式:用字符串作为参数,完成对象的初始化。本质上是字符串到对象的单向映射。
- 单例模式:每一个对象,都只能被初始化一次。就像世界上只有一个独一无二的“你”。
- 建造者模式:设定一个“蓝图”,对象根据蓝图中提供的信息,一步一步构建一个完成的复杂对象。
- 原型模式:使用一个“花名册”,里面保存了所有的对象的单一实例,当需要时,从花名册中“克隆”对象出来使用。体现了缓存思想。
- 享元模式:也用“花名册”,不同的是,从花名册中取出对象不经过“克隆”,而是直接来用。并且可以多次取用同一对象,大家“共享元素”。
空间:结构型模式
如何定义对象之间的关系?
就像公司的组织架构,复杂的程序一定有其内部结构。
结构型模式有以下几种:
- 适配器模式:保留系统已有功能,利用“补丁”,让原有程序可以接入新的其他系统。就像“旅行用插座转接器”一样。
- 装饰器模式:利用“补丁”,在原有程序的基础上,加入新功能。
- 代理模式:为一个对象 A 创建代理人 B,我们不直接操作 A,而是通过 B 间接操作 A。就像是明星经纪人一样。
- 外观模式:为一个黑盒系统,定义外部可以访问的接口。就像是 IPhone 手机的触摸屏,我们的手只操作触摸屏,而不直接操作手机内部的电子元件。
- 桥接模式:为一个系统创建一整套 API 作为“桥”交给外部系统使用,操作“桥”,就是操作系统。就像系统提供了一套“工具箱”,里面有锤子和螺丝刀,我们用工具来访问系统。
- 组合器模式:允许对象自己嵌套自己。有点像套娃,不过组合器模式可以一层里面套多个对象,形成一个树结构。
时间:行为型模式
如何定义对象行为?
程序执行自有其逻辑,大型复杂程序更是。行为型模式给了我们一些思路,让对象之间的交互更有序。
行为型模式有以下几种:
- 策略模式:允许对象根据不同的情况采取不同的执行逻辑。“因地制宜”。
- 模版模式:先总后分,先定义好逻辑的大框架“模版”,然后再定义不同的细分执行步骤。
- 观察者模式:像一个监控,A 监控 B。当 B 改变时 A 立即被通知
- 发布订阅模式:类似于观察者模式,但多了个“中间人”。当 B 状态改变时推送消息给中间人,A 从中间人那里获取数据。有了中间人,A 和 B 之间可以是多对多的关系。
- 拦截过滤器模式:在对一个对象操作之前,先“拦截”下来做些其他的必要处理,然后再操作对象。就像“海关”,在入关时要对进口包裹开箱检查和征税。
- 迭代器模式:假设有一串数据,设计一个迭代器来按照一定顺序访问该数据,而无需知道数据的内部结构。这是计算机的“迭代”思想。
- 责任链模式:把处理器串成一串“链”,当请求进入时,请求被放到链条上挨个询问处理器,直到有一个认领后处理。像一条流水线。
- 命令模式:把“指令”封装成对象,将指令传达到目的地后处理。
- 备忘录模式:把“操作过程”封装成对象,然后记录下来,就是”备忘录“。这样就可以查询和回退操作。
- 状态模式:一个环境里面有多个状态,当状态改变时,环境也跟着改变。
- 访问者模式:数据和操作分离,把数据当作“房间”,操作当作“访问人员”。访问人员可以进入不同的房间操作里面的数据。
- 中介者模式:聊天室模式。聊天室作为中介,大家在其中发言,遵循的是同一套方法。“中介”定义了在某个环境下的“规则”,大家都必须遵循。
- 解释器模式:比较少用到,一般用于编程语言的执行器。处理语法规则。
This work is licensed under Creative Commons Attribution-NonCommercial 4.0 International