Chiriri's blog Chiriri's blog
首页
  • Java

    • JavaSE
    • JavaEE
    • 设计模式
  • Python

    • Python
    • Python模块
    • 机器学习
  • Golang

    • Golang
    • gRPC
  • 服务器

    • Linux
    • MySQL
    • NoSQL
    • Kubernetes
  • 项目

    • 传智健康
    • 畅购商城
  • Hadoop生态

    • Hadoop
    • Zookeeper
    • Hive
    • Flume
    • Kafka
    • Azkaban
    • Hbase
    • Scala
    • Spark
    • Flink
  • 大数据项目

    • 离线数仓
  • 青训营

    • 第四届青训营
  • HTML

    • HTML
    • JavaScript
  • Vue

    • Vue2
    • TypeScript
    • Vue3
    • Uni-APP
  • 数据结构与算法
  • C语言
  • 考研数据结构
  • 计算机组成原理
  • 计算机操作系统
  • Java基础

    • Java基础
    • Java集合
    • JUC
    • JVM
  • 框架

    • Spring
    • Dubbo
    • Spring Cloud
  • 数据库

    • MySQL
    • Redis
    • Elasticesearch
  • 消息队列

    • RabbitMQ
    • RocketMQ
  • 408

    • 计算机网络
    • 操作系统
    • 算法
  • 分类
  • 标签
  • 归档
  • 导航站
GitHub (opens new window)

Iekr

苦逼后端开发
首页
  • Java

    • JavaSE
    • JavaEE
    • 设计模式
  • Python

    • Python
    • Python模块
    • 机器学习
  • Golang

    • Golang
    • gRPC
  • 服务器

    • Linux
    • MySQL
    • NoSQL
    • Kubernetes
  • 项目

    • 传智健康
    • 畅购商城
  • Hadoop生态

    • Hadoop
    • Zookeeper
    • Hive
    • Flume
    • Kafka
    • Azkaban
    • Hbase
    • Scala
    • Spark
    • Flink
  • 大数据项目

    • 离线数仓
  • 青训营

    • 第四届青训营
  • HTML

    • HTML
    • JavaScript
  • Vue

    • Vue2
    • TypeScript
    • Vue3
    • Uni-APP
  • 数据结构与算法
  • C语言
  • 考研数据结构
  • 计算机组成原理
  • 计算机操作系统
  • Java基础

    • Java基础
    • Java集合
    • JUC
    • JVM
  • 框架

    • Spring
    • Dubbo
    • Spring Cloud
  • 数据库

    • MySQL
    • Redis
    • Elasticesearch
  • 消息队列

    • RabbitMQ
    • RocketMQ
  • 408

    • 计算机网络
    • 操作系统
    • 算法
  • 分类
  • 标签
  • 归档
  • 导航站
GitHub (opens new window)
  • JavaSE

  • JavaEE

  • Linux

  • MySQL

  • NoSQL

  • Python

  • Python模块

  • 机器学习

  • 设计模式

    • 设计模式的概念
    • 创建型模式
    • 单例(Singleton)模式
    • 原型(Prototype)模式
    • 工厂(Factory)模式
    • 建造者(Builder)模式
    • 结构型模式(Structural Pattern)
    • 适配器模式(Adapter Pattern)
    • 桥接模式(Bridge Pattern)
    • 装饰器模式(Decorator、Wrapper(包装) Pattern)
    • 代理模式(Proxy Pattern)
    • 外观模式(Facade Pattern)
    • 组合模式(Composite Pattern)
    • 享元模式(Flyweight Pattern)
    • 行为型模式(Behavioral Patterns)
    • 模板方法(Template Method)
    • 策略(Strategy)模式
    • 状态(State)模式
    • 中介者(Mediator)模式
    • 观察者(Observer)模式
    • 备忘录(Memento)模式
    • 解释器(Interpreter)模式
    • 命令(Command)模式
      • 应用场景
      • 注意事项和细节
    • 迭代器(Iterator)模式
    • 访问者(Visitor)模式
    • 职责链(Chain of Responsibility)模式
    • 总结
  • 传智健康

  • 畅购商城

  • 博客项目

  • JVM

  • JUC

  • Golang

  • Kubernetes

  • 硅谷课堂

  • C

  • 源码

  • 神领物流

  • RocketMQ

  • 短链平台

  • 后端
  • 设计模式
Iekr
2023-12-10
目录

命令(Command)模式

# 命令(Command)模式

将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。

命令模式包含以下主要角色。

  • 抽象命令类(Command)角色:声明执行命令的接口,拥有执行命令的抽象方法 execute ()。
  • 具体命令类(Concrete Command)角色:是抽象命令类的具体实现类,它拥有接收者对象,并通过调用接收者的功能来完成命令要执行的操作。
  • 实现者 / 接收者(Receiver)角色:执行命令功能的相关操作,是具体命令对象业务的真正实现者。
  • 调用者 / 请求者(Invoker)角色:是请求的发送者,它通常拥有很多的命令对象,并通过访问命令对象来执行相关请求,它不直接访问接收者。

image-20231210154301931

抽象命令类(Command)角色:声明执行命令的接口,拥有执行命令的抽象方法 execute ()。

/**
 * 抽象命令类
 * Controller、service、dao接口
 */
public interface Command {

    /**
     * 命令的执行方法
     */
    void execute();
}
1
2
3
4
5
6
7
8
9
10
11

具体命令类(Concrete Command)角色:是抽象命令类的具体实现类,它拥有接收者对象,并通过调用接收者的功能来完成命令要执行的操作。

public class OnlineCommand implements Command{

    //dao
    private LeiReceiver leiReceiver = new LeiReceiver();
    @Override
    public void execute() {
        System.out.println("要上课了");
        leiReceiver.online();
    }
}
1
2
3
4
5
6
7
8
9
10
public class WuHanTravelCommand implements Command {
    private LeiReceiver leiReceiver = new LeiReceiver();

    @Override
    public void execute() {
        System.out.println("要去武汉出差了");
        leiReceiver.travel();

    }
}
1
2
3
4
5
6
7
8
9
10

实现者 / 接收者(Receiver)角色:执行命令功能的相关操作,是具体命令对象业务的真正实现者。

public class LeiReceiver {
    public void online(){
        System.out.println("在课堂中");
    }

    public void travel(){
        System.out.println("在出差中");
    }
}
1
2
3
4
5
6
7
8
9

调用者 / 请求者(Invoker)角色:是请求的发送者,它通常拥有很多的命令对象,并通过访问命令对象来执行相关请求,它不直接访问接收者。

/**
 * controller
 */
public class TeacherTongInvoker {
    Command command;

    public void call() {
        // 命令的执行
        command.execute();
    }

    public void setCommand(Command command) {
        this.command = command;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

测试

public class MainTest {
    public static void main(String[] args) {
        TeacherTongInvoker invoker = new TeacherTongInvoker();
        invoker.setCommand(new WuHanTravelCommand());
        invoker.call();
        invoker.setCommand(new OnlineCommand());
        invoker.call();
    }
}
1
2
3
4
5
6
7
8
9

# 应用场景

什么场景用到?

  • mvc 就是典型的命令模式
  • 当系统需要执行一组操作时,命令模式可以定义宏命令(一个命令组合了多个命令)来实现该功能。
  • 结合备忘录模式还可以实现命令的撤销和恢复

Spring 框架的 JdbcTemplate 就使用到了命令模式

image-20231210155441820

  • StatementCallback 接口,类似命令接口 (Command)
  • class QueryStatementCallback implements StatementCallback <T> , SqlProvider , 匿名内部类, 实现了命令接口,同时也充当命令接收者
  • 命令调用者是 JdbcTemplate , 其中 execute (StatementCallback <T> action) 方法中,调用 action.doInStatement 方法。不同的 实现 StatementCallback 接口的对象,对应不同的 doInStatemnt 实现逻辑
  • 另外实现 StatementCallback 命令接口的子类还有 QueryStatementCallback、

image-20231210155554489

# 注意事项和细节

  1. 将发起请求的对象与执行请求的对象解耦。发起请求的对象是调用者,调用者只要调用命令对象的 execute () 方法就可以让接收者工作,而不必知道具体的接收者对象是谁、是如何实现的,命令对象会负责让接收者执行请求的动作,也就是说:” 请求发起者” 和 “请求执行者” 之间的解耦是通过命令对象实现的,命令对象起到了纽带桥梁的作用。
  2. 容易设计一个命令队列。只要把命令对象放到列队,就可以多线程的执行命令
  3. 容易实现对请求的撤销和重做
  4. 命令模式不足:可能导致某些系统有过多的具体命令类,增加了系统的复杂度,这点在在使用的时候要注意
  5. 空命令也是一种设计模式,它为我们 省去了判空的操作。在上面的实例中,如果没有用空命令,我们每按一个按键都要判空,这给我们编码带来一定的麻烦。
  6. 命令模式经典的应用场景:界面的一个按钮都是一条命令、模拟 CMD(DOS 命令)订单的撤销 / 恢复、触发 - 反馈机制
编辑 (opens new window)
上次更新: 2023/12/13, 06:06:02
解释器(Interpreter)模式
迭代器(Iterator)模式

← 解释器(Interpreter)模式 迭代器(Iterator)模式→

最近更新
01
k8s
06-06
02
进程与线程
03-04
03
计算机操作系统概述
02-26
更多文章>
Theme by Vdoing | Copyright © 2022-2025 Iekr | Blog
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式