命令模式(Command):将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作。
package command;
/**
* 命令模式(Command)
* 抽象命令类
*/
public abstract class Command {
protected BarbecueMan receiver;
public Command(BarbecueMan receiver) {
this.receiver = receiver;
}
// 执行命令
public abstract void excuteCommand();
}
package command;
/**
* 命令模式(Command)
* 具体烤羊肉命令
*/
public class BakeMuttonCommand extends Command {
public BakeMuttonCommand(BarbecueMan receiver) {
super(receiver);
}
@Override
public void excuteCommand() {
receiver.bakeMutton();
}
@Override
public String toString() {
return "烤羊肉";
}
}
package command;
/**
* 命令模式(Command)
* 具体烤鸡翅命令
*/
public class BakeChickenWingCommand extends Command {
public BakeChickenWingCommand(BarbecueMan receiver) {
super(receiver);
}
@Override
public void excuteCommand() {
receiver.bakeChickenWing();
}
@Override
public String toString() {
return "烤鸡翅";
}
}
package command;
/**
* 命令模式(Command)
* 烤肉串者
*/
public class BarbecueMan {
// 烤羊肉
public void bakeMutton() {
System.out.println("烤羊肉");
}
// 烤鸡翅
public void bakeChickenWing() {
System.out.println("烤鸡翅");
}
}
package command;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* 命令模式(Command)
* 服务员
*/
public class Waiter {
private List<Command> orders = new ArrayList<>();
// 设置订单
public void setOrder(Command command) {
if (command.toString() == "烤鸡翅") {
System.out.println("服务员:鸡翅没有了,请点别的烧烤。");
} else {
orders.add(command);
System.out.println("增加订单:" + command.toString() + " 时间:" + new Date().toString());
}
}
// 取消订单
public void cancelOrder(Command command) {
orders.remove(command);
System.out.println("取消订单:" + command.toString() + " 时间:" + new Date().toString());
}
// 通知全部执行
public void notice() {
for (Command cmd : orders) {
cmd.excuteCommand();
}
}
}
package command;
/**
* 命令模式(Command)
* 客户端main方法
*/
public class Client {
public static void main(String[] args) {
// 开店前的准备
BarbecueMan man = new BarbecueMan();
Command bakeMuttonCommand1 = new BakeMuttonCommand(man);
Command bakeMuttonCommand2 = new BakeMuttonCommand(man);
Command bakeChickenWingCommand = new BakeChickenWingCommand(man);
Waiter waiter = new Waiter();
// 开门营业
waiter.setOrder(bakeMuttonCommand1);
waiter.setOrder(bakeMuttonCommand2);
waiter.setOrder(bakeChickenWingCommand);
// 点菜完毕,通知厨房
waiter.notice();
}
}