本文共 1690 字,大约阅读时间需要 5 分钟。
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队活记录请求日志,以及支持可撤销的操作。
类比:
(1)Command类,用来声明执行操作的接口
package designmode.order;public abstract class Command { protected Receiver receiver; public Command(Receiver receiver){ this.receiver=receiver; } abstract public void Execute();}
(2)ConcreteCommand类,将一个接收者绑定与一个动作,调用接收者相应的操作,以实现执行动作
package designmode.order;public class ConcreteCommand extends Command{ public ConcreteCommand(Receiver receiver){ super(receiver); } @Override public void Execute() { receiver.action(); }}
(3)Invoker类,要求该命令执行这个请求
package designmode.order;public class Invoker { private Command command; public void SetCommand(Command command){ this.command=command; } public void ExecuteCommand(){ command.Execute(); }}
(4)Receiver类,知道如何实施与执行一个与请求相关的操作,任何类都可能作为一个接收者
package designmode.order;public class Receiver { public void action(){ System.out.println("执行请求!"); }}
(5)客户端代码。创建一个具体命令对象并设定它的接收者
package designmode.order;public class Client { public static void main(String[] args) { Receiver receiver=new Receiver(); Command command=new ConcreteCommand(receiver); Invoker i=new Invoker(); i.SetCommand(command); i.ExecuteCommand(); }}
执行请求!Process finished with exit code 0
(1)优点
(2)在不清楚是否需要某个功能时, 要不要实现命令模式?
不实现。 敏捷开放的原则,不要为代码添加基于猜测的、实际不需要的功能。如果不清楚一个系统是否需要命令模式,一般就不着急去实现它,实际上,在需要的时候通过重构实现这个模式并不困难,只有在真正需要如撤销/恢复操作等功能时,把原来的代码重构为命令模式才更有意义。
转载地址:http://etfdi.baihongyu.com/