美文网首页
CommandPattern命令模式

CommandPattern命令模式

作者: jeff_chang_liu | 来源:发表于2020-08-17 22:19 被阅读0次

命令模式

1.定义

将一个请求封装成一个对象,从而可以使用不同的请求来参数化客户端。

命令模式通常有3种角色

Receiver:接收者角色。负责执行命令的角色

抽象接收者:具有所有特性的接收者的集合

public abstract class AbstractReceiver {

    public abstract void action();
}

具体接收者角色:执行不同的业务逻辑

public class ReceiverOne extends AbstractReceiver {

    @Override
    public void action() {
        System.out.println("执行ReceiverOne的业务逻辑");
    }
}

public class ReceiverTwo extends AbstractReceiver {

    @Override
    public void action() {
        System.out.println("执行ReceiverTwo的业务逻辑");
    }
}

Command:命令角色。需要执行的命令,指定接收者来执行命令

抽象命令:指定命令接收者,并执行命令

public abstract class AbstractCommand {

    /**
     * 定义一个子类的共享变量(命令接收者)
     */
    protected final AbstractReceiver receiver;

    /**
     * 指定命令接收者
     * @param receiver
     */
    public AbstractCommand(AbstractReceiver receiver) {
        this.receiver = receiver;
    }

    /**
     * 执行命令
     */
    public abstract void execute();
}

具体命令:每一个命令是对一个或多个接收者的封装,采用封闭Receiver方式,可以减小上层模块对下层模块的依赖

public class CommandOne extends AbstractCommand {

    /**
     * 指定命令接收者
     * @param receiver
     */
    public CommandOne(AbstractReceiver receiver) {
        super(receiver);
    }

    @Override
    public void execute() {
        super.receiver.action();
    }
}

public class CommandTwo extends AbstractCommand {

    /**
     * 指定命令接收者
     * @param receiver
     */
    public CommandTwo(AbstractReceiver receiver) {
        super(receiver);
    }

    @Override
    public void execute() {
        super.receiver.action();
    }
}

Invoker:调用者角色。接收命令并执行

public class Invoker {

    private AbstractCommand command;

    /**
     * 接收命令
     * @param command
     */
    public void setCommand(AbstractCommand command) {
        this.command = command;
    }

    /**
     * 执行命令
     */
    public void run() {
        this.command.execute();
    }
}

场景类

public class Client {

    public static void main(String[] args) {
        // 声明调用者
        Invoker invoker = new Invoker();

        // 定义一个发送给接收者的命令
        AbstractCommand commandOne = new CommandOne();
        // 调用者执行命令
        invoker.setCommand(commandOne);
        invoker.run();

        AbstractReceiver receiver = new ReceiverTwo();
        AbstractCommand commandTwo = new CommandTwo(receiver);
        invoker.setCommand(commandTwo);
        invoker.run();
    }
}

2.应用

2.1 优点

  • 解耦:调用者角色与接收者角色没有任何关系。
  • 可扩展性:抽象命令的子类容易扩展,调用者及高层模块不产生严重的代码耦合。

2.2 缺点

  • 抽象命令的子类过多,会导致命令角色过于膨胀

2.3 应用场景

触发-反馈机制的处理

3.扩展

撤销命令

3.1 使用备忘录模式还原状态

备忘录模式见后续博文

3.2 新增撤销命令

修改接收者角色,新增rollBack方法,回滚任务

public abstract class AbstractReceiver {

    public abstract void action();

    public abstract void rollBack();
}

public class ReceiverOne extends AbstractReceiver {

    @Override
    public void action() {
        System.out.println("执行ReceiverOne的业务逻辑");
    }

    @Override
    public void rollBack() {
        System.out.println("撤销ReceiverOne的action操作");
    }
}

新增撤销命令

public class RollBackOneCommand extends AbstractCommand {

    /**
     * 指定一个默认命令接收者
     */
    public RollBackOneCommand() {
        super(new ReceiverOne());
    }

    /**
     * 指定命令接收者
     * @param receiver
     */
    public RollBackOneCommand(AbstractReceiver receiver) {
        super(receiver);
    }

    @Override
    public void execute() {
        super.receiver.rollBack();
    }
}

相关文章

  • CommandPattern命令模式

    命令模式 1.定义 将一个请求封装成一个对象,从而可以使用不同的请求来参数化客户端。 命令模式通常有3种角色 Re...

  • iOS --设计模式(4、CommandPattern命令模式)

    命令模式是将请求封装成对象。 很明显,要使用的主UI是UITableView,而对于每个接口的调用,肯定不会去写一...

  • 12.vim的使用技巧

    命令模式 、命令行模式、编辑模式: INSERT 首次进入文件: 命令模式输入: 表示 命令行模式出现...

  • 五、Linux vim编辑器

    vim编辑器三种模式:命令模式、编辑模式、末行模式 1.命令模式: vim进入文件后就是命令模式 1.1 命令模式...

  • 终端操作文件

    VIM 模式切换从命令模式->编辑模式:i,a,o,I,A,O从编辑模式->命令模式:ESC从命令模式->末行模式...

  • vim 操作 && Mac 配置本地Apache

    一、vim 的基本命令操作 vim 的模式: 编辑模式 ,命令模式 编辑模式: 命令模式:可以通过命令 最重要的命...

  • Vim高效编辑器

    Vim程序员高效编辑器 命令模式,输入模式,底线命令模式 默认进入vim就是命令模式,输入i变为输入模式 命令模式...

  • Command模式

    命令模式(Command) 命令模式属于对象的行为模式。命令模式又称为行动(Action)模式或交易(Tran...

  • 设计模式详解——命令模式

    本篇文章介绍一种设计模式——命令模式。本篇文章内容参考《JAVA与模式》之命令模式。 一、命令模式的概念 命令模式...

  • Vi编辑器

    命令模式 文本输入模式 末行模式。 插入模式 移动光标: 删除命令: 撤销命令: 重复命令 文本行移动: 复制粘贴...

网友评论

      本文标题:CommandPattern命令模式

      本文链接:https://www.haomeiwen.com/subject/jqucjktx.html