命令模式-Command
名称:
命令模式(Command Pattern)-对象行为型模式
问题:
The Command pattern encapsulates a request in an object, which enables you to store the command, pass the command to a method, and return the command like any other object.
将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销对操作。
适用性:
-抽象出待执行的动作以参数化某对象。你可以用过程语言中的回调函数表达这种参数化机制。
-在不同的时刻指定、排列和执行请求。一个Command对象可以有一个与初始请求无关的生存期。
-支持取消操作。Command的Excute操作可在实施操作前将状态存储起来在取消操作时这个状态用来消除该操作的影响。Command接口必须添加一个Unexecute操作,该操作取消上一次Execute调用的效果。执行的命令被存储在一个历史列表中。可通过向后和向前遍历这一列表并分别调用Unexecute和Execute来实现重数不限的“取消”和“重做”。
-支持修改日志,这样当系统崩溃时,这些修改可以被重做一遍。
-用构建在原语上的高层操作构造一个系统。
协作:
-Client创建一个ConcreteCommand对象并指定它的Receiver对象。
-某Invoker对象存储该ConcreteCommand对象。
-该Invoker通过调用Command对象的Execute操作来提交一个请求。若该命令是可撤消的,ConcreteCommand就在执行Excute操作之前存储当前状态用于取消该命令。
-ConcreteCommand对象对调用它的Receiver的一些操作以执行该请求。
优点和缺点:
1、Command模式将调用操作的对象与知道如何实现该操作的对象解耦。
2、Command是头等的对象。它们可像其他的对象一样被操纵和扩展。
3、你可将多个命令装配成一个复合命令。
4、增加新的Command很容易,因为这无需改变已有的类。
public class CommandPattern { public static void main(String[] args) { Command cmd=new ConcreteCommand(); Invoker ir=new Invoker(cmd); ir.call(); } }
解决方案:
1、 模式的参与者
1、Command
-声明执行操作的接口。
2、ConcreteCommand
-将一个接受者对象绑定于一个动作。
-调用接受者相应的操作,以实现Execute。
3、Client
-创建一个具体命令对象并设定它的接受者。
4、Invoker
-要求该命令执行这个请求。
5、Receiver
-知道如何实施与执行一个请求相关的操作。任何类都可能作为一个接受。
2.实现方式
interface Command { public void execute(); }
class ConcreteCommand implements Command { private Receiver receiver; ConcreteCommand() { receiver=new Receiver(); } public void execute() { receiver.action(); } }
class Receiver { public void action() { System.out.println("action..."); } }
class Invoker { private Command command; public Invoker(Command command) { this.command=command; } public void setCommand(Command command) { this.command=command; } public void call() { command.execute(); } }
参考资料
《设计模式:可复用面向对象软件的基础》