命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日记,以及支持可撤销的操作。
命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分割开。
优点:
1、它能较容易设计一个命令队列。
2、需要的情况下,可以较容易地将命令记入日记。
3、允许接收请求的一方决定是否要否决请求。
4、可以容易地实现对请求的撤销和重做。
5、由于加入新的具体命令类不影响其它类,所以增添新的命令类很容易。
Command:用来声明执行的接口。
Invoker(waiter):要求该命令执行这个请求。
Receiver(Barbecuer):知道如何实施与执行一个请求相关的操作,任何类都可能作为一个接收者。
ConcreteCommand:将一个接收者对象绑定于一个动作,调用接收者相应的操作,以实现execute。
1 public class Barbecuer { 2 3 public void bakeMutton(){ 4 System.out.println("烤羊肉"); 5 } 6 7 public void bakeChickenWing(){ 8 System.out.println("烤鸡翅"); 9 } 10 11 }
1 //所有命令的接口 2 public abstract class Command { 3 4 protected Barbecuer receiver; 5 6 public Command(Barbecuer receiver){ 7 this.receiver = receiver; 8 } 9 10 public abstract void excuteCommand(); 11 12 }
1 //具体的命令 2 class BakeMuttonCommand extends Command{ 3 4 public BakeMuttonCommand(Barbecuer receiver) { 5 super(receiver); 6 } 7 8 @Override 9 public void excuteCommand() { 10 receiver.bakeMutton(); 11 } 12 13 @Override 14 public String toString() { 15 return "命令模式.烤羊肉"; 16 } 17 18 }
1 class BakeChickenWingCommand extends Command{ 2 3 public BakeChickenWingCommand(Barbecuer receiver) { 4 super(receiver); 5 } 6 7 @Override 8 public void excuteCommand() { 9 receiver.bakeChickenWing(); 10 } 11 12 @Override 13 public String toString() { 14 return "命令模式.烤鸡翅"; 15 } 16 17 }
1 //服务员 2 public class Waiter { 3 4 private List<Command> orders = new ArrayList<Command>(); 5 6 public void setOrder(Command c){ 7 orders.add(c); 8 //记录日记 9 System.out.println("添加订单:"+c.toString()); 10 } 11 12 public void book(){ 13 for(Command c : orders){ 14 c.excuteCommand(); 15 } 16 } 17 18 public void CancelOrder(Command c){ 19 orders.remove(c); 20 //记录日记 21 System.out.println("取消订单:"+c.toString()); 22 } 23 }
1 public static void main(String[] args) { 2 3 Barbecuer barbecuer = new Barbecuer(); 4 5 Command bakeMuttonCommand1 = new BakeMuttonCommand(barbecuer); 6 7 Command bakeMuttonCommand2 = new BakeMuttonCommand(barbecuer); 8 9 Command bakeChickenWingCommand = new BakeChickenWingCommand(barbecuer); 10 11 Waiter girl = new Waiter(); 12 13 girl.setOrder(bakeMuttonCommand1); 14 15 girl.setOrder(bakeMuttonCommand2); 16 17 girl.setOrder(bakeChickenWingCommand); 18 19 girl.book(); 20 }
打印结果:
添加订单:命令模式.烤羊肉
添加订单:命令模式.烤羊肉
添加订单:命令模式.烤鸡翅
烤羊肉
烤羊肉
烤鸡翅