设计模式21——命令模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。

命令模式(Command)

是一种行为型模式。

目录

一、概述

1.1、直观的理解:

1.2、主要角色:

1.3、描述对象之间关系的UML图:

1.4、适用场景:

二、简单举例

2.1、对象之间的关系用UML图和上方概述里的一样:

2.2、Java代码如下:


一、概述

复制代码
1、将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。
复制代码
2、可以在 根据请求执行命令的类 里、设计一个命令队列,把 声明接收者执行哪些命令的类 保存起来;
复制代码
3、允许接受请求的一方拒绝请求。

1.1、直观的理解

其中 ConcreteCommandA 和 ConcreteCommandB 是达到 此模式的目标功能 的重要载体。它把每次的请求都包装到自己独立的实例对象中,也就是说一个ConcreteCommand实例对象包括了一次请求的详细信息,那么我们通过这个对象保存的信息,就能够实现撤销、排队、拒绝等一系列需求了。

1.2、主要角色:

  • Command---声明接收者执行哪些命令的类:++声明接收者执行哪些命令的类的抽象类和接口++ + ++声明接收者执行哪些命令的类++ *,*调用接收者相应操作,以实现请求
  • Invoker---++根据请求执行命令的类++:要求Command执行请求
  • Receiver---++接收者++:有所有请求或命令相关的操作
  • ++请求发起者++:创建一个具体命令对象并设定他的接收者,然后发起请求

1.3、描述对象之间关系的UML图:

1.4、适用场景:

  • 抽象出待执行的动作以参数化某对象。参数化的用处如:回调(先将函数在某处注册,而他在稍后的某个时间运行)。
  • 在不同时刻指定、排列和执行请求
  • 支持取消操作
  • 支持修改日志
  • 用构建在原语操作上的高层操作构造一个系统

二、简单举例

现有两个操作A和B,刚好对应两个请求A和B。这个例子比较简单,不能直观体验到命令模式带来的好处,比如他的功能有:取消请求、给请求排队、记录请求等,这些我暂时不分别演示了。但你可以把本例当做一个模板,然后灵活使用:

2.1、对象之间的关系用UML图和上方概述里的一样:

2.2、Java代码如下:

声明接收者执行哪些命令的类:

java 复制代码
//声明接收者执行哪些命令的类
abstract class Command {
    protected Receiver receiver;

    public Command(Receiver receiver) {
        this.receiver = receiver;
    }

    public abstract void executeCommand();
}

声明接收者执行哪些命令的类A:

java 复制代码
public class ConcreteCommandA extends Command {
    public ConcreteCommandA(Receiver receiver) {
        super(receiver);
    }

    @Override
    public void executeCommand() {
        System.out.println("对请求A的响应");
        this.receiver.actionA();
    }
}

声明接收者执行哪些命令的类B:

java 复制代码
public class ConcreteCommandB extends Command {
    public ConcreteCommandB(Receiver receiver) {
        super(receiver);
    }

    @Override
    public void executeCommand() {
        System.out.println("对请求B的响应");
        this.receiver.actionB();
    }
}

根据请求执行命令的类:

java 复制代码
//根据请求执行命令的类
public class Invoker {
    private Command command;

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

    public void executeCommand() {
        command.executeCommand();
    }
}

接收者:

java 复制代码
//接收者
public class Receiver {
    public void actionA() {
        System.out.println("接收者执行A!");
    }
    public void actionB() {
        System.out.println("接收者执行B!");
    }
}

主程序(发起请求的类):

java 复制代码
public class Main {
    public static void main(String[] args) {
        Receiver receiver = new Receiver();
        Invoker invoker = new Invoker();


        invoker.setCommand(new ConcreteCommandA(receiver));//填装
        invoker.executeCommand();//发出命令A


        invoker.setCommand(new ConcreteCommandB(receiver));//填装
        invoker.executeCommand();//发出命令B
    }
}

这里就不再举例了,可以把上面的Java例子复制到你本地,运行main函数试一下加深理解。这些代码都是我自己学习的时候根据一些教材手敲的,不存在bug可以直接运行。

如果觉得本文还不错,就请点个赞给作者一点鼓励吧!如果有建议,也请评论指教和讨论!

相关推荐
da_vinci_x5 小时前
武器设计实战:一把大剑裂变 5 种属性?Structure Ref 的“换肤”魔法
游戏·3d·设计模式·ai作画·aigc·设计师·游戏美术
刀法孜然9 小时前
23种设计模式 3 行为型模式 之3.7 command 命令模式
设计模式·命令模式
一条闲鱼_mytube11 小时前
智能体设计模式(二)反思-工具使用-规划
网络·人工智能·设计模式
老蒋每日coding12 小时前
AI智能体设计模式系列(七)—— 多 Agent 协作模式
设计模式
小码过河.14 小时前
设计模式——代理模式
设计模式·代理模式
Engineer邓祥浩14 小时前
设计模式学习(14) 23-12 代理模式
学习·设计模式·代理模式
小码过河.15 小时前
设计模式——单例模式
单例模式·设计模式
dxnb2215 小时前
Datawhale26年1月组队学习:Agentic AI+Task2反思设计模式
学习·设计模式
老蒋每日coding15 小时前
AI智能体设计模式系列(八)—— 记忆管理模式
人工智能·设计模式·golang
Mr YiRan15 小时前
重学设计模式之拦截器和责任链
设计模式