Skip to content

设计模式解析与实战

设计模式介绍

设计模式

软件设计中常见问题的典型解决方案。

解决特定问题的一般性概念。

算法 vs 模式

历史

模式 《建筑模式语言》

《设计模式》 =》 应用到程序开发领域

创建型模式

提供创建对象的机制,增加代码的灵活性以及可复用性。

单例模式

保证一个类只有一个实例,并且提供一个全局可访问该实例的节点。

比如说:vue中的路由、store、全局配置文件

建造者模式

将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

比如说:你去kfc吃炸鸡薯条汉堡包都是不变的,但是套餐会发生变化;再说电脑,CPU、内存、硬盘、主机、显示器等硬件设备组装在一起构成一台完整的计算机,且构成的计算机可以是笔记本,也可以是台式机,还可以是不提供显示器的服务器主机

js
function getPhone(size, type, screen, price, disount){}

// 优化为建造者模式,忽略位置且不需要关心没有填写的参数

function getPhone({size, type, screen = 'big', price, disount} = {}){}

// 注意这里一定要加 ={} 防止方法空传参调用 对undefined 结构然后typeError

结构型模式

如何将对象和类组装成较大的结构,同时保持结构的灵活和高效

代理模式

对原有对象进行扩展,从而实现对原有对象的控制或者额外的操作。

比如说:nginx,各种语言的后台,自己封装的axios

js
// 创建axios实例
const service = axios.create({
  // axios中请求配置有baseURL选项,表示请求URL公共部分
  baseURL: import.meta.env.VITE_APP_BASE_API,
  // 超时
  timeout: 20000
})

装饰器模式

一种动态的往一个类中添加新的行为,往往是一种增强。把对象和函数各个功能独立,降低耦合性。

举例:我把藏宝图放到了俄罗斯套娃中;孙悟空有72变(装饰器),当他变成"庙宇"后,他的根本还是一只猴子,但是他又有了庙宇的功能。

熟悉vue源码的话对这段应该不陌生,这里就是一个装饰器

js
const effect = function (fn, options = {}) {
    const effectFn = function () {
        cleanup(effectFn)
        activeEffect = effectFn

        effectStack.push(effectFn)
        fn()
        effectStack.pop()
        activeEffect = effectStack[effectStack.length - 1]
    }
    effectFn.deps = []
    effectFn.options = options 
    effectFn()
    return effectFn
}

与代理模式的区别?

  • 强调的是在不改变对象的基础上,动态地给对象添加功能;
  • 代理模式强调的是对对象访问的控制,可以在访问对象之前进行额外的操作;

适配器模式

让接口不兼容的对象能够相互合作。

比如说:去日本需要一个110V转220V的转接头,不然你手机咋充电。前端传给后端的数据要给对应的数据格式吗,不然就报错。后端给前端的数据格式也要转,不然用不了一点!毕竟你让他改他也不改。

外观(门面)模式

能为程序库、 框架或其他复杂类提供一个简单的接口。

比如说:swagger页面,或者说把某几个方法整合为一个方法然后暴露出去。

行为型模式

负责对象间的高效沟通和职责委派

观察者模式

允许你定义一种订阅机制, 可在对象事件发生时通知多个 “观察” 该对象的其他对象

比如说:vue中的watch,比如vue源码中的deps

发布订阅

发布者负责发布消息,而订阅者则可以选择订阅他们感兴趣的消息类型

比如说:你的手机app总是偷偷用你流量给你发所谓的最新消息,但是大部分你根本不关心,所以你选择了屏蔽他们。再比如vx的公众号,无论你关注与否,如果运营人员还健在,都会发布文章,但是你只有关注了才看得到。

发布订阅与观察者模式的区别:

  • 观察者模式是1对多,发布订阅是多对多
  • 发布订阅中间有一个中间层,发布者和订阅者不是直接信息交换
  • 发布订阅是异步的,观察者模式是同步的

其他

还有一些没说的设计模式,可以看看 这个

鄂ICP备2024055897号