命令模式(Command) 将一个请求封装成一个对象,从而使你可以用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。
示例
需求: 模拟顾客点餐(下命令Command),服务员记录订单(Invoker,要求厨师执行command),并告知厨师订单的类目(Receiver,具体的命令的执行者,任何类都可作为接收者)。
Command,声明执行操作的接口:
/**
* 命令对象
*/
public interface Command {
void execute(Cook cook);
}
烤羊肉串的命令:BakeMuttonCommand
public class BakeMuttonCommand implements Command {
@Override
public void execute(Cook cook) {
cook.BakeMutton();
}
}
烤鸡翅的命令:BakeChickenWingCommand
public class BakeChickenWingCommand implements Command {
@Override
public void execute(Cook cook) {
cook.BakeChickenWing();
}
}
厨师Cook(Receiver):
/**
* Receiver, Cook,厨师
*/
public class Cook {
public void BakeMutton() {
System.out.println("厨师烤羊肉串");
}
public void BakeChickenWing() {
System.out.println("厨师烤鸡翅");
}
}
服务员waiter:
/**
* Invoker,要求命令执行。这是也就是服务员告诉厨师做什么
*/
public class Waiter {
//命令集合
private List<Command> commands;
//receiver
private static final Cook cook;
static {
cook = new Cook();
}
public Waiter() {
commands = new ArrayList<>();
}
//下订单
public void setCommand(Command command) {
if (command instanceof BakeChickenWingCommand) {
System.out.println("顾客下单烤鸡翅...");
} else if (command instanceof BakeMuttonCommand) {
System.out.println("顾客下单烤羊肉串...");
}
commands.add(command);
System.out.println("日志:增加订单:" + command.getClass().getSimpleName() + " 增加时间:" + new Date());
}
//取消订单
public void cancelCommand(Command command) {
commands.remove(command);
System.out.println("日志:取消订单:" + command.getClass().getSimpleName() + " 取消时间:" + new Date());
}
//执行订单
public void notifyCommands() {
for (Command c : commands) {
c.execute(cook);
}
}
}
测试:
@Test
public void commandTest() {
//服务员
Waiter waiter = new Waiter();
//顾客点单
Command mutton = new BakeMuttonCommand();
Command chicken = new BakeChickenWingCommand();
//服务员记录点单内容并通知厨师执行
waiter.setCommand(mutton);
waiter.setCommand(chicken);
waiter.notifyCommands();
waiter.cancelCommand(mutton);
waiter.notifyCommands();
}
测试结果:
顾客下单烤羊肉串...
日志:增加订单:BakeMuttonCommand 增加时间:Mon Oct 16 10:39:16 CST 2017
顾客下单烤鸡翅...
日志:增加订单:BakeChickenWingCommand 增加时间:Mon Oct 16 10:39:16 CST 2017
厨师烤羊肉串
厨师烤鸡翅
日志:取消订单:BakeMuttonCommand 取消时间:Mon Oct 16 10:39:16 CST 2017
厨师烤鸡翅
命令模式的作用:
- 它能比较容易的设计一个命令队列
- 在需要的情况下,可以容易的将命令记入日志
- 允许接收请求的一方决定是否要否决请求
- 容易实现对请求的撤销和重做
- 新增具体命令类也比较容易
本文地址:http://blog.csdn.net/ProdigalWang/article/details/78247650