持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第13天,点击查看活动详情
结构型设计模式
这一类设计模式关注点在于 如何将类或者对象组合成更大更复杂的结构,以此来简化设计。
JavaScript结构型设计模式一共有 7 种:
- 外观模式
- 适配器模式
- 代理模式
- 装饰者模式
- 桥接模式
- 组合模式
- 享元模式
1. 外观模式
为一组复杂的子系统接口提供一个更高级别的统一接口,通过这个接口使得对子系统接口的访问变得更加容易。
外观模式的核心点在于 封装,常使用外观模式来解决浏览器的 兼容问题。 它通过封装方法可以将浏览器不兼容的方法变得简单且兼容各个浏览器。
除此之外,很多代码库会使用该模式来进行功能封装,进而 简化底层操作方法。
2. 适配器模式
将一个类(对象)的接口(方法或者属性)转化成另一个接口,以满足用户需求,使类(对象)之间接口的不兼容问题通过适配器得以解决。
适配器模式的核心点在于 转化,当A类的接口不兼容B类的接口的时候,我们可以通过书写一个A-B适配器来使得两个接口兼容,从而避免重写相同的功能代码。
适配器很多时候是对对象内部结构的重组,因此使用适配器模式的前提是对对象的自身结构足够了解。
适配器的应用范围很广,比如说 JQuery适配器、数据适配器、参数适配器、服务端数据适配器等。
3. 代理模式
由于一个对象不能直接引用另一个对象,所以需要通过代理对象在这两个对象之间起到中介作用。
代理模式的核心点在于 中介(间接) ,当我们无法直接完成一件事情的时候,我们可以通过只用代理对象来间接完成它。
常见的用到代理模式的场景有 跨域、站长统计、代理模板等。
4. 装饰者模式
在不改变原对象的基础上,通过对其进行包装拓展(添加属性和方法)使得原对象可以满足用户更加复杂的需求。
装饰者模式的核心点在于 包装,它是在不改变原有对象的基础上,对其方法或属性进行的拓展。它与适配器模式不同的地方在于,它是在原有基础上进行一种良性拓展,无需了解原有功能的具体实现,只需要在外部进行一次封装拓展。
5. 桥接模式
在系统沿着多个维度变化的同时,又不增加其复杂度以达到解耦。
桥接模式的核心点在于 解耦,它通过将实现层(元素绑定的事件)与抽象层(事件的实现逻辑)解耦分离,使得两部分可以相互独立变化。
桥接模式主要是对结构之间的解构,通过该模式实现解耦,将实现层与抽象层分开处理, 避免需求的改变造成对象内部的修改,体现了面向对象对拓展的开发以及对修改的关闭原则。
与装饰者模式相比,装饰者模式是进行深度的拓展,一层一层的包裹,而桥接模式则是横向拓展,多维度拓展。
这个模式的缺点就是 有时会造成开发成本的增加以及性能有时候也会受到影响。
6. 组合模式
又称为“部分-整体”模式,将对象组合成树形结构以表示部分-整体的层次结构。
组合模式的核心点在于 树形结构和接口统一,这个模式为我们提供了一个清晰的组成结构,方便了我们对数据的使用与管理。
接口统一可以通过让组合对象继承同一个父类来实现。接口统一的实现可以使得 用户对单个对象和组合对象的使用具有一致性。
7. 享元模式
运用共享技术有效地支持大量细粒度的对象,避免对象间拥有相同内容造成多余的开销。
享元模式的核心点在于 共享对象,通过使用享元模式来减少重复对象的数量,进而达到减少内存开销,提高性能的目的。
这种模式因为要将无法共享的部分抽离出来作为外部属性和方法,因此会在一定程度上增加了代码的复杂性。