一、简单介绍
如果要给对象添加功能,一般我们会用继承的方式,即创建一个父类,我们的对象继承这个父类即可。但是,在复用的时候,可能会创建出大量的子类。这时,我们可以采用动态为对象添加功能的方式,而不是通过创建新的类来实现。这种给对象动态的添加功能的方式就是装饰装饰者模式。
因为js中的对象是基于原型的,并非传统的面向对象的语言中对象是基于类的,所以在js中实现装饰者模式非常的简单,给对象添加方法即可。不过从开发的角度来看,我们一般将这个过程封装起来。在这里,介绍一种AOP的方式,即:面向切面编程。在处理主要业务的过程中,遇到部分公共业务,以AOP的方式对业务进行解耦。
二、使用场景
部分功能,可能因使用场景的不同而有细微的区别。比如,一个发送请求的模块,在一个项目中需要带上token,另一个项目不需要带上token,或者是token来源不同。如果写两份类似的模块,那么是比较冗余的。如果通过参数来控制,则需要修改原来的代码。在这时,我们就可以用装饰者模式的动态的写入token。
所以,那些不同场景下有细微区别的模块,可以用装饰者模式对他们进行一次动态的包装,从而避免修改原模块的代码或者是copy出第二份类似的模块。
三、示例
这里用一个为发送http请求动态写入token的示例来说明装饰者模式
//这是一个装饰者 按照AOP的原则为功能动态注入一个前置函数
const before = function(fn, beforeFn) {
return function(...arg) {
beforeFn.apply(this, arg);
return fn