Skip to content
On this page

什么是装饰器模式

指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。

✅ 优点

装饰器模式的主要优点有:

  • 装饰器是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用。
  • 装饰器模式完全遵守开闭原则,因为我们增加功能是在不改变原有对象的情况下。

❌ 缺点

装饰器模式过度使用会增加许多额外逻辑,增加程序的复杂性。

装饰器的例子

就拿一个 CRUD 的例子来说吧,先有一个用户的表格,现在需要实现一个新增用户的功能,于是你写了:

js
class UserAction {
  constructor() {
    this.userList = [
      {name: '1', age: '1'},
      {name: '2', age: '2'},
      {name: '3', age: '3'},
    ]
  }
  add(userinfo) {
    this.userList.push(userinfo)
  }
  delete(userinfo) {
    this.userList.splice(this.userList.indexOf(userinfo), 1)
  }
  static getUser() {
    if (UserAction.instance) {
      return UserAction.instance
    }
    UserAction.instance = new UserAction()
    return UserAction.instance
  }
}

const useraction = UserAction.getUser()

useraction.add({name: '4', age: '4'})

然后又加了个需求,添加完了要给个提示,添加成功了,你可能觉得很简单:

js
add(userinfo) {
  this.userList.push(userinfo)
  message('添加成功了')
}

但是这样做的话,万一别人用到了你的逻辑,那别的地方也就都会提示,但是你不能确定别人需不需要。而且不符合开闭原则。此时我们就换一种做法:

js
function addUser(userinfo) {
  useraction.add(userinfo)
  message('添加成功了')
}

一些很常见的例子

  • vscode 的插件(我们需要某个插件,不可能说给人家vscode提需求,让人家搞吧,于是就有了插件系统,暴露了一些类给我们扩展功能)
  • webpack、Chrome 的插件同样如此
  • 穿衣服的搭配,平时穿衣服可能会搭配围巾、项链、手表、胸针...,这些东西都是装饰,我们不会要求说把围巾和衣服缝合在一起。