携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天,点击查看活动详情
基本介绍
1)命令模式,在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接受者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接受者即可,此时,可以使用命令模式来进行设计
2)命令模式使得请求发送者与请求接受者消除彼此之间的耦合,让对象之间的调用关系更加灵活,实现解耦
3)在命名模式中,会将一个请求封装成为一个对象,以便使用不同参数来表示不同的请求,同时命名模式也支持可撤销的操作。
4)通俗易懂的理解:将军发布命令,士兵去执行,其中有几个角色:将军(命令发布者)、士兵(命令的具体执行者)、命令(连接将军和士兵)
命令模式的注意事项和细节
1)将发起请求的对象与执行请求的对象解耦。发起请求的对象是调用者,调用者只要调用命令对象的execute()方法就可以让接受者工作,而不必指导具体的接收者对象是谁,是如何实现的,命令对象会负责让接受者执行请求的动作,也就是说,“请求发起者”和“请求执行者”之间的解耦是通过命令对象实现的,命令对象起到了纽带桥梁的作用。
2)容易涉及一个命令队列,只要把命令对象放到列队,就可以多线程的执行命令
3)容易实现对请求的撤销和重做
4)命令模式不足:可能导致某些系统有过多的具体命令类,增加了系统的复杂度,这点在使用的时候要注意
5)空命令也是一种设计模式,他为我们省去了判空的操作。
6)命令模式经典的场景:界面的一个按钮都是一条命令, 模拟CMD订单的撤销/恢复、触发-反馈机制
类图
示例代码
package com.example.demo.design.command;
public class ConcreteCommand extends Command{
public ConcreteCommand(Receiver receiver) {
super(receiver);
}
@Override
public void execute() {
receiver.action();
}
}
package com.example.demo.design.command;
public abstract class Command {
protected Receiver receiver;
public Command(Receiver receiver){
this.receiver = receiver;
}
abstract public void execute();
}
package com.example.demo.design.command;
public class Invoker {
private Command command;
public void setCommand(Command command){
this.command = command;
}
public void executeCommand(){
command.execute();
}
}
package com.example.demo.design.command;
public class Receiver {
public void action(){
System.out.println("执行命令");
}
}
package com.example.demo.design.command;
public class Client {
public static void main(String[] args) {
Receiver receiver = new Receiver();
Command command = new ConcreteCommand(receiver);
Invoker invoker = new Invoker();
invoker.setCommand(command);
invoker.executeCommand();
}
}
结果