命令模式(Command Pattern)是行为型模式,它将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
命令模式中的命令(command)指的是一个执行某些特定事情的指令。
三种角色:
- Receiver接收者角色:该角色就是干活的角色,命令传到这里应该是被执行的
- Command命令角色:需要执行的所有命令都在这里声明,向接收者发送对应的命令
- Invoker调用者角色:发出命令
命令模式的使用场景
- 不知道请求对象、接收对象、执行的操作,但是希望以解耦的方式设计程序
命令模式的实现
class Cooker{
execute(){
console.log('做饭');
}
}
class Cleaner{
execute(){
console.log('保洁');
}
}
class CookCommand{
constructor(receiver){
this.receiver = receiver;
}
execute(){
this.receiver.execute();
}
}
class CleanCommand{
constructor(receiver){
this.receiver = receiver;
}
execute(){
this.receiver.execute();
}
}
class Customer{
constructor(command){
this.command = command;
}
execute(){
this.command.execute();
}
}
优缺点
优点
- 降低系统的耦合度,命令迷失能将调用操作的对象与实现该操作的对象解耦
- 增加或删除命令非常方便,采用命令模式增加与删除命令不会影响其他类,它满足开闭原则,对扩展比较灵活
- 可以实现宏命令,命令模式可以与组合模式结合,将多个命令配成一个组合,即宏命令
- 方便实现undo和redo操作,命令模式可以与备忘录模式结合,实现命令的撤销与恢复
缺点
- 使用命令模式可能会导致某些系统有过多的命令类
- 系统结构更加复杂