一、概述
命令模式(Command),将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
二、UML图示
三、代码实现
1、reciever类
public class Barbecuer {
public void bakeMutton(){
System.out.println("烤羊肉串!");
}
public void bakeChilkenWing(){
System.out.println("烤鸡翅!");
}
}
2、command类
public abstract class Command {
protected Barbecuer receiver;
public Command(Barbecuer receiver) {
this.receiver = receiver;
}
public abstract void excuteCommand();
}
3、具体命令类
public class BakeChickenWingCommand extends Command {
public BakeChickenWingCommand(Barbecuer receiver) {
super(receiver);
}
@Override
public void excuteCommand() {
receiver.bakeChilkenWing();
}
}
public class BakeMuttonCommand extends Command {
public BakeMuttonCommand(Barbecuer receiver) {
super(receiver);
}
@Override
public void excuteCommand() {
receiver.bakeMutton();
}
}
4、invoker类
public class Waiter {
private List<Command> list = new ArrayList<>();
public void setOrder(Command command){
list.add(command);
System.out.println("增加新订单:"+command.getClass().getName());
}
public void cancelOrder(Command command){
list.remove(command);
System.out.println("取消订单:"+command.getClass().getName());
}
public void notifyMessage(){
for (Command comand:list) {
comand.excuteCommand();
}
}
}
5、测试类
public class Test {
public static void main(String[] args) {
//开店前准备
Barbecuer boy =new Barbecuer();
BakeChickenWingCommand bakeChickenWingCommand = new BakeChickenWingCommand(boy);
BakeChickenWingCommand bakeChickenWingCommand1 = new BakeChickenWingCommand(boy);
BakeMuttonCommand bakeMuttonCommand = new BakeMuttonCommand(boy);
Waiter girl = new Waiter();
//顾客点菜
girl.setOrder(bakeChickenWingCommand);
girl.setOrder(bakeChickenWingCommand1);
girl.setOrder(bakeMuttonCommand);
//通知厨房
girl.notifyMessage();
}
}
输出:
增加新订单:com.zbf.commandMode.BakeChickenWingCommand
增加新订单:com.zbf.commandMode.BakeChickenWingCommand
增加新订单:com.zbf.commandMode.BakeMuttonCommand
烤鸡翅!
烤鸡翅!
烤羊肉串!
注:参考文献《大话设计模式》程杰著。