java命令模式

命令模式:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,已经支持可撤销的操作。

适应范围:1、能比较容易的设计一个命令队列

2、在需要的情况下,可以比较容易地将命令记录日志

3、允许接受请求的一方决定是否要撤销请求

4、容易的实现对请求的撤销和重做

5、加入新的命令类不影响到其他的类,异常增加新类很容易

6、命令模式把请求一个操作的对象与知道怎么执行一个操作对象分隔开。

package command; //抽象命令 public abstract class Command { protected Barbecuer receiver; public Command(Barbecuer receiver) { this.receiver = receiver; } //执行命令 abstract public void ExcuteCommand(); }

public class Barbecuer { //烤羊肉串 public void BakeMutton() { System.out.println("烤羊肉串!"); } //烤鸡翅 public void BakeChickenWing() { System.out.println("烤鸡翅!"); } }

//烤鸡翅命令 public class BakeChickenWingCommand extends Command{ public BakeChickenWingCommand(Barbecuer receiver) { super(receiver); } @Override public void ExcuteCommand() { receiver.BakeChickenWing(); } public String toString() { return "命令模式.BakeChickenWingCommand"; } }

//烤羊肉串命令 public class BakeMuttonCommand extends Command{ public BakeMuttonCommand(Barbecuer receiver) { super(receiver); } @Override public void ExcuteCommand() { receiver.BakeMutton(); } public String toString() { return "命令模式.BakeMuttonCommand"; } }

//服务员 public class Waiter { private ArrayList<Command> orders = new ArrayList<Command>(); //设置订单 public void setOrder(Command command) { if(command.toString() == "命令模式.BakeChickenWingCommand") { System.out.println("服务员:鸡翅没有了,请点别的烧烤"); }else { orders.add(command); System.out.println("增加订单:" + command.toString()); } } //取消订单 public void cancelOrder(Command command) { orders.remove(command); System.out.println("取消订单:" + command.toString()); } //通知执行 public void notifyCommand() { for(Command cmd : orders) { cmd.ExcuteCommand(); } } }

public class TestCommand { public static void main(String[] args) { //开店前的准备 Barbecuer boy = new Barbecuer(); Command bakeMuttonCommand1 = new BakeMuttonCommand(boy); Command bakeMuttonCommand2 = new BakeMuttonCommand(boy); Command backChickenWingCommand1 = new BakeChickenWingCommand(boy); Waiter girl = new Waiter(); //开门营业,顾客点菜 girl.setOrder(bakeMuttonCommand1); girl.setOrder(bakeMuttonCommand2); girl.setOrder(backChickenWingCommand1); //点菜完毕,通知厨房 girl.notifyCommand(); } }

java命令模式