设计模式-命令模式(Command)

命令模式:将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化;对请求排队或记录日志,以及支持可撤销的操作,将”发出请求的对象”和”接收与执行这些请求的对象”分隔开来。

 

角色和职责:

1.Command:

   声明执行操作的接口

2.Concrete Command:

    具体实现

3.Invoker:

  执行者

4.Receiver:

接收者

 

 

UML图

具体代码:

/**
 * 接收者
 */
public class Receiver {
    public void action(){
        System.out.println("执行一个命令");
    }
    public void unAction(){
        System.out.println("撤销一个命令");
    }
}
/**
 * 命令接口
 */
public interface Command {
    void execute();//执行
    void undo();//撤回
}
/**
 * 具体命令
 */
public class ConcreteCommand implements Command{
    private Receiver receiver;

    public ConcreteCommand(Receiver receiver){
        this.receiver = receiver;
    }
    @Override
    public void execute() {
        receiver.action();
    }

    @Override
    public void undo() {
        receiver.unAction();
    }
}
/**
 * 调用者
 */
public class Invoker {
    public Command command;

    public Command getCommand() {
        return command;
    }

    public void setCommand(Command command) {
        this.command = command;
    }

    //执行命令
    public void executeAction(){
        command.execute();
    }
    //撤销命令
    public void undoAction(){
        command.undo();
    }
}
public class Main {
    public static void main(String[] args) {
        //创建命令的接收者
        Receiver receiver = new Receiver();
        //创建命令,设定接收者
        Command command = new ConcreteCommand(receiver);
        //创建执行者
        Invoker invoker = new Invoker();
        invoker.setCommand(command);//设置对应的命令

        //执行命令
        invoker.executeAction();
        invoker.undoAction();
    }
}

结果:

执行一个命令
撤销一个命令

 

命令模式(Command)的应用效果:
1)command模式将调用操作的对象和实现该操作的对象解耦
2)可以将多个命令装配成一个复合命令,复合命令是Composite模式的一个实例
3)增加新的command很容易,无需改变已有的类

 

命令模式(Command)的适用性

    1.抽象出待执行的动作以参数化某对象。

    2.在不同的时刻指定、排列和执行请求。

    3.支持取消操作。

    4.支持修改日志,这样当系统崩溃时,这样修改可以被重做一遍。

    5.用构建在原语操作上的高层操作构造一个系统。

 

 

源码地址:https://github.com/qjm201000/design_pattern_command.git

 

posted @ 2018-12-17 09:55  qjm201000  阅读(201)  评论(0编辑  收藏  举报