CommandPattern命令模式

命令模式

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();
    }
}
(0)

相关推荐

  • Java设计模式【命令模式】

    命令模式 命令模式很好理解,举个例子,司令员下令让士兵去干件事情,从整个事情的角度来考虑,司令员的作用是,发出口令,口令经过传递,传到了士兵耳朵里,士兵去执行.这个过程好在,三者相互解耦,任何一方都不 ...

  • PHP设计模式之命令模式

    PHP设计模式之命令模式 命令模式,也称为动作或者事务模式,很多教材会用饭馆来举例.作为顾客的我们是命令的下达者,服务员是这个命令的接收者,菜单是这个实际的命令,而厨师是这个命令的执行者.那么,这个模 ...

  • 轻松实现记录与撤销——C#中的Command模式

    Command模式属于行为模式,作为大名鼎鼎的23个设计模式之一,Command模式理解起来不如工厂模式,单例模式等那么简单直白.究其原因,行为模式着重于使用,如果没有编程实践,确实不如创造模式那么直 ...

  • 简说设计模式——命令模式

    一.什么是命令模式 在说命令模式前我们先来说一个小例子.很多人都有吃夜市的经历,对于那些推小车的摊位,通常只有老板一个人,既负责制作也负责收钱,我要两串烤串多放辣,旁边的人要了三串烤面筋不要辣,过了一 ...

  • 【Java设计模式】 Java设计模式之(六)命令模式(Command Pattern)

    命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式.请求以命令的形式包裹在对象中,并传给调用对象.调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该 ...

  • 图解Java设计模式之命令模式

    智能生活项目需求 命令模式基本介绍 命令模式的原理类图 命令模式在Spring框架中JdbcTemplate应用源码分析 命令模式的注意事项和细节 智能生活项目需求 看一个具体的需求 我们买类一套智能 ...

  • 设计模式(十五)——命令模式(Spring框架的JdbcTemplate源码分析)

    设计模式(十五)——命令模式(Spring框架的JdbcTemplate源码分析)

  • [PHP小课堂]PHP设计模式之命令模式

    [PHP小课堂]PHP设计模式之命令模式 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[DarkMatterZyCoder/149844827]免费得PHP.项目管理学习资料

  • Command 命令模式

    >>返回<C#常用设计模式> 1. 简介 2. 示例 1. 简介 把方法调用封装起来: 通过封装方法调用,可以把运算块封装成形,所以调用此运算对象不需要知道事情是如何进行的.通 ...

  • 命令模式

    一.命令模式介绍 1.定义与类型 定义:将"请求"封装成对象,以便使用不同的请求 命令模式解决了应用程序中对象的职责以及它们之间的通信方式 类型:行为型 2.适用场景 请求调用者和 ...

  • 设计模式之命令模式

    让我们从一个简单的项目(遥控器)了解命令模式,然后再给出他的定义: 此项目地址: https://github.com/Stray-Kite/Design-Pattern/tree/master/sr ...