当前位置: 首页 > article >正文

探索设计模式:命令模式

探索设计模式:命令模式

    • 🧐1. 概念
    • 🎯2. 作用
    • 📦3. 实现
      • 3.1 定义命令接口
      • 3.2 实现具体命令
      • 3.3 实现接收者
      • 3.4 实现调用者
      • 3.5 使用
    • 💻4. 应用场景

在这里插入图片描述

  命令模式Command Pattern)就是一种行为型设计模式。其核心思想是将请求封装成一个对象,从而使你可以使用不同的请求、队列或者请求日志参数化其他对象,同时支持可撤销的操作。通过命令模式,可以将请求的发起者和接收者完全解耦,提高系统的灵活性和可扩展性。

🧐1. 概念


  想象一下,当你在家里使用遥控器控制电视时,你按下遥控器上的“电源”按钮,电视就会开启或关闭。在这个过程中,遥控器(调用者)并不知道电视(接收者)是如何工作的,它只是发送了一个“打开”或“关闭”的请求。命令模式正是基于这样的思路,将请求本身封装成一个对象,这样可以更容易地管理和执行请求。

命令模式通常包含四个关键角色:

  1. 命令Command):这是一个抽象类或接口,定义了执行操作的标准方法。所有的具体命令类都实现了这个接口,确保它们可以以统一的方式被调用。
  2. 具体命令Concrete Command):这是命令接口的具体实现,包含了执行操作的具体逻辑。每个具体命令类都关联了一个接收者对象,并且知道如何调用接收者的某个方法来完成任务。
  3. 接收者Receiver):接收者是真正执行命令的对象。它包含了具体的业务逻辑,当一个命令被执行时,实际上是调用了接收者的一个或多个方法。
  4. 调用者Invoker):调用者负责触发命令的执行。它可以持有一个或多个命令对象,并在适当的时候调用命令的执行方法。调用者不需要知道命令的具体实现细节,只需要知道如何调用即可。

🎯2. 作用


  1. 解耦:命令模式最大的优势在于它能够彻底解耦命令的发起者和接收者,使两者之间的依赖关系降到最低。这意味着可以在不改变原有代码的情况下,轻松地引入新的命令类型或修改现有命令的行为。
  2. 扩展性:由于命令对象实现了统一的接口,因此可以很容易地添加新的命令类,而不会影响到现有的系统接口。此外,命令模式还支持组合命令,即一个命令可以包含多个子命令,形成更复杂的操作序列。

📦3. 实现


  假设我们要开方法一个简单的智能家居控制系统,用户可以通过遥控器(调用者)控制家中的各种电器设备(接收者),如灯光、电视等。

我们可以通过命令模式来实现这一功能。

3.1 定义命令接口


public interface Command {
    void execute();
}

3.2 实现具体命令


public class LightOffCommand implements Command {

    private Light light;

    public LightOffCommand(Light light) {
        this.light = light;
    }

    @Override
    public void execute() {
        light.turnOff();
    }
}
public class LightOnCommand implements Command {

    private Light light;

    public LightOnCommand(Light light) {
        this.light = light;
    }

    @Override
    public void execute() {
       light.turnOn();
    }
    
}

3.3 实现接收者


public class Light {

    public void turnOn(){
        System.out.println("Light is on");
    }

    public void turnOff(){
        System.out.println("Light is off");
    }

}

3.4 实现调用者


public class RemoteControl {

    private Command command;

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

    public void pressButton(){
        command.execute();
    }

}

3.5 使用


public class CommandClient {

    public static void main(String[] args) {
        Light light = new Light();
		// 遥控器对象
        RemoteControl remoteControl = new RemoteControl();
		// 具体命令对象
        LightOnCommand lightOnCommand = new LightOnCommand(light);
        LightOffCommand lightOffCommand = new LightOffCommand(light);
		
		// 为遥控器设置命令
        remoteControl.setCommand(lightOnCommand);
        // remoteControl.setCommand(lightOffCommand);
		
		// 按下遥控器按钮
        remoteControl.pressButton();
    }

}

💻4. 应用场景


  1. 用户界面操作:在图形用户界面中,命令模式常用于处理各种用户输入事件,如按钮点击、菜单选择等。通过将这些操作封装成命令对象,界面组件可以独立于具体的业务逻辑,提高了代码的可复用性和可测试性。
  2. 事务管理:在需要支持事务回滚的系统中,命令模式可以帮助实现复杂的撤销/重做功能。每个命令不仅包含执行操作的方法,还可以包含撤销操作的方法,从而在必要时恢复到之前的状态。
  3. 队列处理:当系统需要处理大量异步请求时,可以使用命令模式将请求封装成命令对象并放入队列中等待处理。这中做法有助于平滑负载,避免资源争用。
  4. 日志记录:对于需要记录操作历史以便后续审计或分析的系统,命令模式提供了一种自然的方式来保存命令对象,方便日后查询和恢复。

http://www.kler.cn/a/379290.html

相关文章:

  • 什么是 OpenTelemetry?
  • ArcGIS005:ArcMap常用操作101-150例动图演示
  • 九,数据类型存储
  • 数据结构 —— AVL树
  • ThinkPHP腾讯云国际短信对接
  • 复习数据库(约束)上篇
  • 第三十二章 Vue组件分类及存放位置
  • 本质矩阵分解计算Rt
  • 宝塔FTP服务配置结合内网穿透实现安全便捷的远程文件管理和传输
  • 广东网站设计提升你网站在搜索引擎中的排名
  • 搭建支持国密GmSSL的Nginx环境
  • 【AI+教育】一些记录@2024.11.04
  • latex中公式之间的省略号
  • C++ 内存对齐:alignas 与 alignof
  • 基于Matlab 模拟停车位管理系统【源码 GUI】
  • Selenium的下载及chrome环境搭建
  • git入门教程14:Git与其他工具的集成
  • 构造有向(无向)加权图
  • 机器学习算法之回归算法
  • 来康生命科技有限公司心率监测解决方案在健身房与康养机构的应用探索
  • Docker Hub 镜像加速器
  • 鸿蒙Harmony-圆形绘制组件Circle使用详解
  • 基于python的机器学习(一)—— 基础知识(Scikit-learn安装)
  • JVM 类加载器
  • 单调栈--- 分奖金
  • 开源呼叫中心系统 FreeIPCC:WebRTC 详解