JavaScript 设计模式之命令模式

75 阅读2分钟

纯JavaScript版本的设计模式之命令模式。

定义

发送者通过命令对象发送命令给接收者。

命令:一个执行某些特定事件的指令。

是一种行为型设计模式。

意义

把请求封装到命令对象中,消除请求发送者和请求接收者之间的耦合关系。

发送者不需要知道接收者是什么样的,怎么处理的。

实践

用函数实现命令模式

智能家居:回家开门后,自动开灯,开空调 。

// 命令1
const openLight3 = () => {
    console.log("open light");
};

// 命令2
const openAC = () => {
    console.log("open AC");
};
  
// 宏命令
const openDoor = () => {
    console.log("open door after:");
    openLight3();
    openAC();
};

// 执行命令
openDoor();

宏命令:一组命令的集合,通过执行宏命令的方式,可以一次执行一批命令。

Redux 的撤销重做

实际开发中,我们使用 Redux 来管理项目的各种状态。我觉得一个一个的action很像发出的命令。

发送者:dispatch(type)

命令对象: action(type)

接收者: reducer(state)

不知道这样理解是否正确

Redux支持撤销重做

两个宏命令:Undo, Redo

state结构:

todos: {
    //过去状态
    past: [ 
      [],
      [ { text: 'Use Redux' } ],
      [ { text: 'Use Redux', complete: true } ]
    ],
    // 当前状态
    present: [ { text: 'Use Redux', complete: true }, { text: 'Implement Undo' } ],
    // 未来状态
    future: [
      [ { text: 'Use Redux', complete: true }, { text: 'Implement Undo', complete: true } ]
    ]
}

执行宏命令Undo:

  1. 移除 past 中的最后一个元素。
  2. 将上一步移除的元素赋予 present。
  3. 将原来的 present 插入到 future 的最前面。

执行宏命令Redo:

  1. 移除 future 中的第一个元素。
  2. 将上一步移除的元素赋予 present。
  3. 将原来的 present 追加到 past 的最后面。

总结

命令模式在JavaScript语言中是一种隐形的模式,一般用闭包和高阶函数来实现命令模式。

hello,我是杨浅~

生命不息,学习不止,励志写更优雅的代码~

一位初出茅庐的写作小学生,欢迎大神们严厉指正,温柔批评~