public class Barbecuer { public void MakeMutton() { System.out.println("烤羊肉串!"); } public void MakeChickenWing() { System.out.println("烤鸡翅!"); } }
public class Main { public static void main(String[] args) { Barbecuer boy=new Barbecuer(); boy.MakeMutton(); boy.MakeChickenWing(); } }
客户端程序与烤肉串者紧耦合,尽管简单但却极为僵化,有许许多多的安全隐患。
级别2
public class Barbecuer { public void MakeMutton() { System.out.println("烤羊肉串!"); } public void MakeChickenWing() { System.out.println("烤鸡翅!"); } }
public abstract class Command { private Barbecuer barbecuer; public Command(Barbecuer bar) { this.barbecuer=bar; } public Barbecuer getBarbecuer() { return barbecuer; } public abstract void excuteCommand(); }
public class BakeChickenWingCommand extends Command { public BakeChickenWingCommand(Barbecuer bar) { super(bar); } @Override public void excuteCommand() { this.getBarbecuer().MakeChickenWing(); } }
public class BakeMuttonCommand extends Command { public BakeMuttonCommand(Barbecuer bar) { super(bar); } @Override public void excuteCommand() { this.getBarbecuer().MakeMutton(); } }
import java.util.*; public class Waiter { public List<Command> orders=new ArrayList<Command>(); // 设置订单 public void setOrder(Command com) { orders.add(com); System.out.println("add an order "+new Date()); } // 取消订单 public void cancelOrder(Command com) { orders.remove(com); System.out.println("Cancel the order "+new Date()); } // 全部执行 public void inform() { for(Command c:orders) { c.excuteCommand(); } } }
public class Main { public static void main(String[] args) { //开店前的准备 Barbecuer boy=new Barbecuer(); Command command1=new BakeMuttonCommand(boy); Command command2=new BakeMuttonCommand(boy); Command command3=new BakeChickenWingCommand(boy); //开门营业顾客点菜 Waiter waiter=new Waiter(); waiter.setOrder(command1); waiter.setOrder(command2); waiter.setOrder(command3); //通知厨房 waiter.inform(); //取消订单 waiter.cancelOrder(command2); //再次通知厨房 waiter.inform(); } }命令模式,将一组行为抽象为对象,实现二者之间的松耦合。在软件系统中,行为请求者与行为实现者通常呈现一种紧耦合。但在某些场合,比如要对行为进行记录、撤销/重做、事务等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,需要将行为请求者与行为实现者解耦。使用命令模式较容易地设计一个命令队列;在需要的情况下,可以容易地将命令记入日志;允许接收请求的一方决定是否要否决请求;可以容易地实现对请求的撤销和重做;由于加进新的具体命令类不影响其他的类,因此增加新的具体命令类很容易。敏捷开发原则告诉我们,不要为代码添加基于猜测的、实际不需要的功能。如果不清楚一个系统是否需要命令模式,一般就不要着急去实现它,事实上,在需要的时候通过重构实现这个模式并不困难,只有在真正需要如撤销/恢复操作等功能时,把原来的代码重构为命令模式才有意义。