70.设计模式笔记-命令模式

来源:互联网 发布:英语视频翻译软件 编辑:程序博客网 时间:2024/05/01 11:03

转载请注明出处 http://blog.csdn.net/qq_31715429/article/details/78501040
本文出自:猴菇先生的博客

1.定义
将一个请求封装成一个对象,从而让用户使用不同的请求把客户端参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。

2.使用场景
需要抽象出待执行的动作,然后以参数的形式提供出来。
在不同的时刻指定、排列和执行请求。一个命令对象可以有与初始化请求无关的生存期。
需要支持取消操作。
支持修改日志功能,这样当系统崩溃时,这些修改可以被重做一遍。
需要支持实务操作。

3.例子

/** * 接受者类 */public class Receiver{    /**     * 真正执行具体命令逻辑的方法     */    public void action(){        System.out.println("执行具体操作");    }}
public interface Command{    /**     * 执行具体操作的命令     */    void execute();}
/** * 具体命令类 */public class ConcreteCommand implements Command{    private Receiver mReceiver;//只有一个对接受者对象的引用    public ConcreteCommand(Receiver receiver){        mReceiver = receiver;    }    @Override    public void execute(){        // 调用接受者的相关方法来执行具体逻辑        mReceiver.action();    }}
/** * 请求者类 */public class Invoker{    private Command mCommand;//持有一个对相应命令对象的引用    public Invoker(Command command){        mCommand = command;    }    public void action(){        mCommand.execute();//调用具体命令对象的相关方法,执行具体命令    }}
public class Test{    public static void main(String[] args){        Receiver receiver = new Receiver();        Command command = new ConcreteCommand(receiver);        Invoker invoker = new Invoker(command);        invoker.action();    }}

将行为调用者与实现者解耦。
接受者负责具体实施或执行一个请求,命令类在接受者和命令执行的具体行为之间加以弱耦合,请求者调用命令对象执行具体的请求。
在请求者里使用一个数据结构来存储执行过的命令对象,以此可以方便地知道执行过哪些命令动作,并可以在需要时恢复。

4.总结
缺点是大量衍生类的创建,但是具有更弱的耦合性、更灵活的控制性以及更好的扩展性。

原创粉丝点击