经典的设计模式一共有23种,分别是创建型,结构型,行为型。
结构型有七种,分别是,装饰器模式,代理模式,桥接模式,适配器模式,享元模式,门面模式,组合模式。
装饰模式
定义:在不影响原有功能的基础上,添加新的代码,增强原始类的功能。
这个有点像我们使用的 CSS 覆盖,不改变原有的代码,通过添加一个更高权重的 CSS 样式,达到我们想要的新样式。
也有点像我们平时写网页是,使用的 HTML加上 CSS。HTML 是主体框架,而 CSS 是装饰 HTML 的,让我们的网页更加美观。
代理模式
一个对象由于种种原有,不能直接访问另一个对象,需要一个第三方(也就是代理)牵桥搭线从而间接达到访问目的。
日常的我们所知道的婚介所,经纪人都是代理模式的例子。
##桥接模式
桥接模式的目的是将接口部分和实现部分分离,从而让它们可以较为容易,也相对独立地加以改变。
也可以理解为,一个类存在两个(或多个)独立变化的维度,我们通过组合的方式,让这两个(或多个)维度可以独立进行扩展。
适配器模式
定义:适配器就是通过一个类的接口变换成客户端所期待的另一种接口,可以帮我们解决接口不兼容的问题。
前端axios这个请求库就是用到了适配器模式,我们只需要关注统一的接口,不用考虑在 node 环境或者浏览器环境有什么不同。uni-app 也是一个适配类型的库,可以一套代码多端发行。uni-app 本身就是一个很好的适配器的例子。
适配器模式只是我们为了兼容接口的一种方式,当初设计的时候,业务没这么复杂,没有预料到以后的发展,为了兼容,使用适配器可以老代码继续工作。
适配器是一种“补偿模式”,用来补救设计上的缺陷。如果在设计初期,我们能设计合理,这种模式就没有应用机会了。
门面模式
定义:为子系统提供一组统一的接口,定义一组高层接口让子系统更易用。
门面模式主要是为了让接口更易于使用,而适配器模式是为了兼容接口。是设计的理念不同。
如果我们想要调用 A,B,C接口并获取里面的值,这时候我们可以在这三个接口外面套一个 D 接口。直接调用 D 接口获取 A,B,C 接口的值。这样子的设计让我们省了多次请求的时间。
组合模式
定义:将一组对象组织(Compose)成树形结构,以表示一种“部分 - 整体”的层次结构。组合让客户端(在很多设计模式书籍中,“客户端”代指代码的使用者。)可以统一单个对象和组合对象的处理逻辑。
组合模式适合应用在数据结构呈现树形结构,比如说,公司的组织结构,有分公司,部门,组等。而且单个对象和组合对象的处理逻辑都一样,可以使用递归的方式来进行处理。
享元模式
定义:共享的单元,当有大量的重复对象时,可以利用享元模式,把对象设计成享元不可变的对象,在内存中只保存一个对象,然后引用这个对象就可以。
对于百万在线的游戏,比如五子棋,其中线条,棋子的颜色,房间的背景都是不会变的,这时候就可以使用享元模式,设计出一个享元对象,然后让使用到时候引用即可。
参考资料
极客时间《设计模式之美》
曾探 《JavaScript 设计模式和开发实践》
修言 《JavaScript 设计模式核⼼原理与应⽤实践》