跳至主要內容

如果用命令模式打开西游记会发生什么

萌萌哒草头将军大约 5 分钟前端JavaScript设计模式

在打开西游记之前,我先介绍下命令模式

命令模式介绍

思想

命令模式的功能是将一个请求或者操作包装在一个对象中,并将参数传递给调用对象,从而使方法和调用者的职责分离。

优点

这么做的好处一方面使系统变得松藕,另一方面可以根据不通过的请求对客户进行参数化调用,从而使整个系统具有更高的灵活性。

缺点

因为事务的复杂度可能会出现很多的类

需要使用命令模式的场景

命令模式的使用场景有

  1. 需要根据参数确定执行哪个方法时
  2. 需要随时追踪撤销或者重做某些操作时(即事务场景)

模型

image.png
命令模式需要的角色分别是:Client(客户端)Invoker(调用者)Commond(命令接口)concreteCommand(具体的命令)Receiver(接受者)

  • Client(客户端):具体的使用者,一般通过调用者执行客户端想要做的事情
  • Invoker(调用者):接收命令,并且执行这些命令
  • Commond(命令接口):规定具体的命令需要实现的接口
  • concreteCommand(具体的命令):具体的命令,需要实现命令接口
  • Receiver(接受者):正在执行命令的类

实现

源码点这里open in new window

class Receiver {
  constructor (name, specialSkill) {
    this.name = name
    this.specialSkill = specialSkill
  }
  useSpecialSkill () {
    console.log(
      this.name,
      '双手合十,口念:“阿弥陀佛”,随后使出了他的看家本领',
      this.specialSkill
    )
  }
}

class Invoker {
  constructor () {
    this.commmandList = []
  }
  addCommand (command) {
    console.log('如来说:亲,你点的', command.receiver.name, '给你安排了')
    this.commmandList.push(command)
  }
  excuteCommand () {
    console.log('如来捏了个兰花指,然后打了个响指空空、戒戒、沙沙分别走了上来')
    this.commmandList.map(command => command.excute())
  }
}

class Command {
  constructor (receiver) {
    console.log('"给我来一个', receiver.name, '"')
    this.receiver = receiver
  }
  excute () {
    this.receiver.useSpecialSkill()
  }
}

// client 客户端
console.log('夕阳西下,唐唐拖着长长的背影,走进了灵山白金翰佛堂。')
console.log('几个苦行僧打扮的服务员迎了上来,双手合十,鞠躬道:“阿弥陀佛,施主想来些啥?”')
console.log('唐唐嚣张的骂道:“啥档次,跟我一样说阿弥陀佛,把你们老板叫出来!”')
console.log('如来听到唐唐的声音,边穿衣服边对身边的白骨精说道:“你稍等片刻,我去去就来”。随后夺门而出。')
console.log('如来迎了上啦,拉住唐唐的手道:')
console.log('老弟好久没来了啊,有失远迎,还请见谅啊!!!')
console.log('“我佛慈悲,出家人怎会计较这些,弟子马上要出发了,来这里买几个徒弟,路上消遣,岂不美哉”')
console.log('如来从身后拿出了ipad,递给唐唐,“你选吧”')
console.log('唐唐接过平板,看着每页的图片,边点边念叨到:')

const kongkong = new Receiver('空空', '连续72个后空翻')
const jiejie = new Receiver('戒戒', '36种不同姿势钢管舞')
const shasha = new Receiver('沙沙', '萨克斯')

// 给我来一个空空,我看看他的看家本领怎么样
const command1 = new Command(kongkong)
// 再给我来一个戒戒,我想看看他的看家本领怎么样
const command2 = new Command(jiejie)
// 最后再给我来一个沙沙,我想看看他的看家本领怎么样
const command3 = new Command(shasha)

// 如来
const invoker = new Invoker()

// 如来说:亲,你要一个空空、沙沙、戒戒,分别看看他的看家本领,好的,给你安排了
invoker.addCommand(command1)
invoker.addCommand(command2)
invoker.addCommand(command3)
console.log('唐唐:”好的,这些我先看看他们的本领怎么样“')

// 如来翘起了兰花指,然后打了个响指,空空、戒戒、沙沙分别走了上来
invoker.excuteCommand()
console.log('唐唐满意的点了点头:”好的,爷不差钱,这些个挺不错的,俺都要了!!!“')
console.log('如来说:“如果觉得好用,回头记得一键三连哦~”')

如果用命令模式打开西游记会发生什么,你会欣赏到下面的小短文

夕阳西下,唐唐拖着长长的背影,走进了灵山白金翰佛堂。

几个苦行僧打扮的服务员迎了上来,双手合十,鞠躬道:“阿弥陀佛,施主想来些啥?”

唐唐嚣张的骂道:“啥档次,跟我一样说阿弥陀佛,把你们老板叫出来!”

如来听到唐唐的声音,边穿衣服边对身边的白骨精说道:“你稍等片刻,我去去就来”。随后夺门而出。

如来迎了上来,拉住唐唐的手道:

"老弟好久没来了啊,有失远迎,还请见谅啊!!!"

“我佛慈悲,出家人怎会计较这些,弟子马上要出发了,来这里买几个徒弟,路上消遣,岂不美哉”

如来从身后拿出了ipad,递给唐唐,“你选吧”

唐唐接过平板,翻着精美的图片,边点边念叨到:

"给我来一个 空空 "

"给我来一个 戒戒 "

"给我来一个 沙沙 "

如来说:亲,你点的 空空 给你安排了

如来说:亲,你点的 戒戒 给你安排了

如来说:亲,你点的 沙沙 给你安排了

唐唐:”好的,这些我先看看他们的本领怎么样“

如来捏了个兰花指,然后打了个响指空空、戒戒、沙沙分别走了上来

空空 双手合十,口念:“阿弥陀佛”,随后使出了他的看家本领 连续72个后空翻

戒戒 双手合十,口念:“阿弥陀佛”,随后使出了他的看家本领 36种不同姿势钢管舞

沙沙 双手合十,口念:“阿弥陀佛”,随后使出了他的看家本领 萨克斯

image.png

唐唐满意的点了点头:”好的,爷不差钱,这些个挺不错的,俺都要了!!!“

如来说:“如果觉得好用,回头记得一键三连哦~”