使用松耦合的方式设计程序,向某些对象发送一些请求,并不需要请求的接受者和谁来操作,使得发送者和接收者消除彼此间的耦合关系。
概要
将一个请求封装为一个对象,从而你可以用不同的请求对客户进行参数化;对请求排队或记录日志,同时支持撤销的操作
- 接受者 receiver 执行具体操作
- command对象 封装excute方法,使客户不用关心是如何执行的
- Invoker 设置命令与通知执行命令,用于排队等
简例
将各种按钮与按钮的具体执行功能解耦
按钮的具体执行功能,也就是接收者:
|
|
为按钮安装命令:
|
|
封装command对象:
|
|
执行:12345var refresh = new RefreshCommand(MenuBar)var add = new AddCommand(SubMenu)setCommand(button1, refresh)setCommand(button2, add)
javaScript中的命令模式
命令模式的由来,其实是回调(callback)函数的一个面向对象的替代品。
在js中,可以使用函数来替代对象,进行四处传递和封装功能
使用闭包实现command对象
command对象的关键就是,保存接受者receiver的引用,然后封装执行函数,所以我们可以通过闭包来实现它:
|
|
撤销命令
撤销命令,也是命令模式的关键
撤销命令一般是给command对象添加一些unexcute或者undo方法,执行excute的反向操作
|
|
重做命令
针对某些不可逆的命令,我们可以将所有的命令缓存,并从头执行到上一步即可
命令队列
将命令用队列缓存,当接受者执行完后,再将队列等待的第一个命令对象执行
宏命令
相当于执行一组命令的集合
总结
- 更容易的设计命令队列
- 容易进行日志记录
- 允许接收请求方否决请求
- 方便撤销和重做
- 解耦请求操作和执行操作
在JavaScript中,可以用高阶函数对命令进行封装,在JavaScript模式中,是一种隐形模式。