命令模式
将一个请求封装为一个对象(即我们创建的Command对象),从而使你可用不同的请求对客户进行参数化; 对请求排队或记录请求日志,以及支持可撤销的操作。
代码展示
定义一个抽象的命令接口
public interface Command {
void execute();复制代码
}
定义一个 Receiver 负责执行命令
public class Receiver {
public void doSomething() { System.out.println("番茄炒西红柿"); }复制代码
}
定义一个具体的命令, 创建命令的时候会指定命令的执行者 Receiver
public class ConcreteCommand implements Command {
private Receiver receiver; public ConcreteCommand(Receiver receiver) { this.receiver = receiver; } @Override public void execute() { receiver.doSomething(); }复制代码
}
定义一个调用者 Invoker
public class Invoker {
private Command command; public void setCommand(Command command) { this.command = command; } public void action() { command.execute(); }复制代码
}
定义一个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.action(); }复制代码
}
角色介绍
情景: 饭店里一个客户在看菜单, 服务员在下单, 厨师在后厨做菜.
客户: Client; 服务员: Invoker ; 厨师: Receiver; 番茄炒西红柿: ConcreteCommand
这个就是准备好的菜单:
Receiver receiver = new Receiver();
Command command = new ConcreteCommand(receiver);复制代码
如果客户要退菜就得告诉服务员番茄炒西红柿不要了. 同理如果客户觉得番茄炒西红柿很好吃可以再加一份.所以命令的取消和重新发起逻辑应该是由服务员(Invoker) 来实现的. 然而我常常遇到的情况是服务员说菜已经好了. 那就没有办法退菜(取消命令)了.