这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战
命令模式
将请求封装为一个对象,使得发出请求的责任和执行请求的责任分隔开,两者之间通过命令对象进行沟通,这样方便将命令对象进行存储、传递、调用、增加与管理。
模式结构
- 抽象命令类:声明执行命令的接口,拥有执行命令的抽象方法
- 具体命令类:是抽象命令类的具体实现,他拥有接收者对象,并通过调用接收者的工来完成命令要执行的操作
- 实现者/接收者:执行命令功能的相关操作,是具体命令对象业务的真正实现者
- 调用者/请求者:是请求的发送者,它通常拥有很多的命令对象,并通过访问命令对象来执行相关请求,它不直接访问接收者
(() => {
const cmd = new ConcreteCommand(new Receiver());
const ir = new Invoker(cmd);
console.log("客户访问调用者的call()方法...");
ir.call();
})();
//调用者
class Invoker {
constructor(private command: Command) {
this.command = command;
}
public setCommand(command: Command) {
this.command = command;
}
public call() {
console.log("调用者执行命令command...");
this.command.execute();
}
}
//抽象命令
interface Command {
execute(): void;
}
//具体命令
class ConcreteCommand implements Command {
constructor(private receiver: Receiver) {
this.receiver = receiver;
}
public execute() {
this.receiver.action();
}
}
//接收者
class Receiver {
constructor(){}
public action() {
console.log("接收者的action()方法被调用...");
}
}
复制代码
开发中,方法请求者 与 方法的实现者 存在紧密的耦合关系时,将导致软件功能的扩展与维护。
主要优点
- 引入抽象接口降低系统的耦合度
- 使用命令模式进行增加和删除命令不会影响其他的类,且满足开闭原则,扩展性良好
- 可以在现有命令的基础上,增加额外功能。比如日志记录,
主要缺点
- 可能变得复杂,因在发送者和接收者中间增加了一个全新的层次
适用场景
- 若需要通过操作来参数化对象时,可使用命令模式
- 若想把操作放入队列中,操作的执行活着远程执行操作,可使用命令模式
- 若想实现回滚功能操作时,可使用命令模式