-
命令模式(Command),讲一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销的操作。
-
第一,它能较容易地设计一个命令队列;第二,在需要的情况下,可以较容易地将命令计入日志;第三,允许接收请求的一方就决定是否要否决请求。第四,可以容易的实现对请求的撤销和重做,第五,由于加进新的具体命令类不影响其他的类,因此增加新的具体命令类很容易。
-
命令模式把请求一个操作的对象与知道怎么执行这个操作的对象分隔开。
-
敏捷开发的原则告诉我们,不要为代码添加基于猜测的、实际不需要的功能。如果不清楚一个系统是否需要命令模式,一般不要着急去实现它,事实上,在需要的时候通过重构实现这个模式并不困难,只有在真正需要如撤销/恢复操作等功能时,把原来的代码重构为命令模式才有意义。
-
Command .java
/** * 用来声明执行操作的接口 */ public abstract class Command { protected Receiver receiver; public Command(Receiver receiver) { this.receiver = receiver; } abstract public void Execute(); }
-
ConcreteCommand .java
public class ConcreteCommand extends Command { public ConcreteCommand(Receiver receiver) { super(receiver); }
-
Execute.java
@Override public void Execute() { receiver.action(); } }
-
Receiver.java
/** * 厨师角色 */ public class Receiver { public void action() { System.out.println("执行请求"); } }
-
Invoker.java
/** * 服务员角色 */ public class Invoker { private Command command; public void setCommand(Command command) { this.command = command; } public void ExecuteCommand() { command.Execute(); } }
-
Main.java
public class Main { public static void main(String[] args) { final Receiver r = new Receiver(); Command c = new ConcreteCommand(r); final Invoker i = new Invoker(); i.setCommand(c); i.ExecuteCommand(); } }