命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分割开。【组合】

public abstract class Command {
protected List<Reciever> recievers;
public Command(List<Reciever> recievers) {
this.recievers = recievers;
}
public void addRecievers(Reciever reciever) {
this.recievers.add(reciever);
}
public abstract void execute();
}
class ConcreteCommand extends Command {
public ConcreteCommand(List<Reciever> recievers) {
super(recievers);
}
@Override
public void execute() {
for (Reciever reciever : recievers) {
reciever.action();
}
}
}
interface Reciever {
public void action();
}
class RecieverA implements Reciever {
@Override
public void action() {
System.out.println("RecieverA执行请求!");
}
}
class RecieverB implements Reciever {
@Override
public void action() {
System.out.println("RecieverB执行请求!");
}
}
class RecieverC implements Reciever {
@Override
public void action() {
System.out.println("RecieverC执行请求!");
}
}
public class Invoker {
private Command command;
public void setCommand(Command command) {
this.command = command;
}
public void executeCommand() {
command.execute();
}
}
public class CommandClient {
public static void main(String[] args) {
List<Reciever> recievers = new ArrayList<Reciever>();
recievers.add(new RecieverA());
recievers.add(new RecieverB());
recievers.add(new RecieverC());
Command command = new ConcreteCommand(recievers);
Invoker invoker = new Invoker();
invoker.setCommand(command);
invoker.executeCommand();
}
}
案例 烤羊肉串
public abstract class Command {
protected BarbecueMan receiver;
public Command(BarbecueMan receiver) {
this.receiver = receiver;
}
public abstract void excuteCommand();
}
public class BakeChickenWingCommand extends Command {
public BakeChickenWingCommand(BarbecueMan receiver) {
super(receiver);
}
@Override
public void excuteCommand() {
receiver.bakeChickenWing();
}
@Override
public String toString() {
return "烤鸡翅";
}
}
public class BakeMuttonCommand extends Command {
public BakeMuttonCommand(BarbecueMan receiver) {
super(receiver);
}
@Override
public void excuteCommand() {
receiver.bakeMutton();
}
@Override
public String toString() {
return "烤羊肉";
}
}
public class BarbecueMan {
public void bakeMutton() {
System.out.println("烤羊肉");
}
public void bakeChickenWing() {
System.out.println("烤鸡翅");
}
}
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();
}
}
}
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();
}
}