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

转载请注明出处 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.总结
缺点是大量衍生类的创建,但是具有更弱的耦合性、更灵活的控制性以及更好的扩展性。

猜你喜欢

转载自blog.csdn.net/qq_31715429/article/details/78501040