一、简介
命名模式(Command),将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。
简而言之就是将命令调用者和命令执行者通过命令对象解耦。
二、结构图
三、代码实现
1. Command
public abstract class Command {
protected Receiver receiver;
public Command(Receiver receiver) {
this.receiver = receiver;
}
public abstract void execute();
}
2.ConcreteCommand
public class ConcreteCommand extends Command{
public ConcreteCommand(Receiver receiver) {
super(receiver);
}
@Override
public void execute() {
receiver.action();
}
}
3.Invoke
public class Invoker {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void execute() {
command.execute();
}
}
4.Receiver
public class Receiver {
public void action() {
System.out.println("执行请求!");
}
}
5.Client
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.execute();
}
}
四、总结
- 命令模式将发出请求的对象与执行请求的对象解耦。发起请求的对象是调用者,调用者只要调用命令对象的execute方法就可以让接收者工作,而不必知道具体的接收者对象是谁、是如何实现,命令对象会负责让接收者执行请求的动作,也就是说“请求发起者”和“请求执行者”之间的解耦是通过命令对象实现的。
- 容易设计一个命令队列,只要把命令对象放到队列中,就可以执行多线程的执行命令。
- 在需要的情况下,可以较容易地将命令记入日志。
- 新增具体命令类不影响其他的类。
- 可以容易地实现对请求的撤销和重做。