概念
Decorator Pattern:不改变原有对象的前提下,动态地给一个对象增加一些额外的功能。
运用了AOP设计思想,用途广泛,比如logger,防抖…给系统,函数扩展新功能,先拦截再处理。
使用
现在Es7的一个提案(类似 java 注解的语法糖):Decorator,可以实现 装饰者模式
Babel转码器已经支持。因为很多浏览器还不支持,在项目中,需要babel转化成Es5。
下面是vue
项目中的使用:
npm安装依赖
1
npm install babel-core babel-loader babel-plugin-transform-decorators babel-plugin-transform-decorators-legacy babel-preset-env
配置
.babelrc
文件1
2
3
4{
"presets": ["env"],
"plugins": ["transform-decorators-legacy"]
}在
webpack.config.js
中添加babel-loader
1
2
3
4
5module: {
rules: [
{ test: /\.js$/, exclude: /node_modules/, loader: "babel-loader" }
],
}如果为VsCode,可能还需要在项目根目录下添加以下
tsconfig.json
文件来组织一个ts检查的报错1
2
3
4
5
6
7
8
9{
"compilerOptions": {
"experimentalDecorators": true,
"allowJs": true,
"lib": [
"es6"
],
}
}
举例
借鉴淘宝前端团队写的文章:ES7 Decorator写了一下例子
下面实现,为钢铁侠装备盔甲(纯粹的装饰模式,不增加对原有类的接口)和增加飞行能力(半透明的装饰模式,有点像适配器模式)
1 | // 装备盔甲 |
优点
- 比继承灵活:继承是在编译器起作用,装饰者模式可以在运行时扩展一个对象的功能;另外也可以通过配置文件在运行时选择不同的装饰器,从而实现不同的行为;也通过不同的组合,实现不同的效果。
- 符合开闭原则:不用更改原有对象,只需要添加新的在装饰类,就可以达到增强的效果
缺点
- 需要创建一些具体装饰类,会增加系统的复杂度