打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
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();
    }
}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
命令模式(Command Pattern)
命令模式——行为型模式(2)
命令模式——邮局发信
简说设计模式——命令模式
命令模式 Command 行为型 设计模式(十八)
C#设计模式系列:命令模式(Command)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服