百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

设计模式-命令模式(命令设计模式使用场景)

wptr33 2025-06-13 17:19 7 浏览

写在前面

Hello,我是易元,这篇文章是我学习设计模式时的笔记和心得体会。如果其中有错误,欢迎大家留言指正!

一、什么是命令模式?

命令模式是行为模式中的一种,通过将请求封装成对象,使开发者可以用不同的请求、队列或日志来参数化其他对象。
类比订外卖的过程:用户(触发者)在APP下单(命令),餐厅收到订单后(接收者)开始制作。平台不需要关心具体由谁做饭,只负责传递订单。

二、命令模式解释

命令模式的核心架构:

  1. 命令(Command)
    声明执行操作的统一接口,将请求封装为独立对象,使调用者与实现者解耦。
  2. 接收者(Receiver)
    封装具体业务能力,仅关注领域逻辑实现,不感知调用流程。
  3. 具体命令(ConcreteCommand)
    持有 Receiver 引用,在 Command 接口方法中通过委托执行 Receiver 的业务方法,可存储请求上下文参数。
  4. 触发者(Invoker)
    维护命令执行入口(触发命令方法),支持命令的存储和调度(如实现命令队列或历史记录),仅依赖 Command 接口。
  5. 客户端(Client)
    创建 Receiver 实例,构造 ConcreteCommand 并绑定 Receiver,配置 Invoker 与命令的关联关系。

三、案例实践

以居家控制系统为例,实现对灯光、空调的远程控制。先展示不使用命令模式的实现,再分析其不足。

基础类(接收者)

// 电灯类
public class Light {
    public void on() { System.out.println("开灯"); }
    public void off() { System.out.println("关灯"); }
}

// 空调类
public class AirConditioner {
    public void on() { System.out.println("空调开启"); }
    public void off() { System.out.println("空调关闭"); }
}

硬编码实现

public class HomeController {
    private Light light;
    private AirConditioner ac;

    public HomeController() {
        light = new Light();
        ac = new AirConditioner();
    }

    // 每新增一个设备,就需要修改 switch-case
    public void executeCommand(String command) {
        switch (command) {
            case "LIGHT_ON": light.on(); break;
            case "AC_ON": ac.on(); break;
            default: System.out.println("未知命令");
        }
    }
}

问题分析:新增设备(如窗帘)时,必须修改 HomeController 的 switch-case 结构。随着功能增加,代码将难以维护,且难以实现组合操作。

命令模式实现

1. 抽象命令类

public interface Command {
    void execute();  // 执行命令(例如开灯)
    void undo();     // 撤销命令(例如关灯)
}

2. 具体命令

// 电灯命令
public class LightOnCommand implements Command {
    private Light light;
    public LightOnCommand(Light light) { this.light = light; }
    @Override
    public void execute() { light.on(); }
    @Override
    public void undo() { light.off(); }
}

// 空调命令
public class ACOnCommand implements Command {
    private AirConditioner ac;
    public ACOnCommand(AirConditioner ac) { this.ac = ac; }
    @Override
    public void execute() { ac.on(); }
    @Override
    public void undo() { ac.off(); }
}

3. 控制器(触发者)

public class SmartHomeController {
    // 命令存储
    private Map<String, Command> commands = new HashMap<>();
    // 操作历史记录
    private Stack<Command> history = new Stack<>();

    // 绑定命令:例如将"开灯"按钮绑定到 LightOnCommand
    public void setCommand(String buttonName, Command command) {
        commands.put(buttonName, command);
    }

    // 执行命令
    public void executeCommand(String buttonName) {
        Command cmd = commands.get(buttonName);
        if (cmd != null) {
            cmd.execute();
            history.push(cmd); // 记录历史操作
        }
    }

    // 撤销上一步
    public void undoLastCommand() {
        if (!history.isEmpty()) {
            Command lastCmd = history.pop();
            lastCmd.undo();
        }
    }
}

4. 测试类(客户端)

@Test
public void test() {
    Light light = new Light();
    AirConditioner ac = new AirConditioner();
    SmartHomeController controller = new SmartHomeController();

    // 绑定命令
    controller.setCommand("开灯", new LightOnCommand(light));
    controller.setCommand("开空调", new ACOnCommand(ac));

    // 执行操作
    controller.executeCommand("开灯");    // 输出:开灯
    controller.executeCommand("开空调");  // 输出:空调开启
    controller.undoLastCommand();        // 输出:空调关闭
}

四、如何新增设备?以窗帘为例

1. 新增窗帘类(接收者)

public class Curtain {
    public void open() { System.out.println("打开窗帘"); }
    public void close() { System.out.println("关闭窗帘"); }
}

2. 新增窗帘命令

public class CurtainCommand implements Command {
    private Curtain curtain;
    public CurtainCommand(Curtain curtain) { this.curtain = curtain; }
    @Override
    public void execute() { curtain.close(); } // 执行:关闭窗帘
    @Override
    public void undo() { curtain.open(); }     // 撤销:打开窗帘
}

3. 使用新功能(无需修改控制器)

// 绑定新命令
Curtain curtain = new Curtain();
controller.setCommand("关窗帘", new CurtainCommand(curtain));
controller.executeCommand("关窗帘");  // 输出:关闭窗帘

改进效果:新增设备时,只需添加对应的 Command 类,无需修改控制器代码,且更容易实现组合命令。

五、长话短说

核心思想

将操作抽象为独立对象,通过参数化方式传递请求,解耦调用者与实现者。

适用场景

  • 需要解耦请求发送者与执行者
  • 需支持撤销/重做操作
  • 需实现事务操作(组合命令)
  • 需记录操作历史
  • 需支持任务队列或线程池调度

代码实现步骤

  1. 定义 Command 接口,声明执行方法。
  2. 创建具体命令类实现接口,并注入 Receiver 对象。
  3. 创建 Invoker 类管理命令对象。
  4. 客户端初始化顺序
    a. 创建 Receiver
    b. 创建 Command 并关联 Receiver
    c. 创建 Invoker 并绑定 Command
  5. 通过 Invoker 执行命令。

典型应用

  • 智能家居控制系统
  • 文本编辑器的撤销/重做
  • 事务型数据库操作
  • 任务调度系统
  • GUI 事件处理

相关推荐

Python自动化脚本应用与示例(python办公自动化脚本)

Python是编写自动化脚本的绝佳选择,因其语法简洁、库丰富且跨平台兼容性强。以下是Python自动化脚本的常见应用场景及示例,帮助你快速上手:一、常见自动化场景文件与目录操作...

Python文件操作常用库高级应用教程

本文是在前面《Python文件操作常用库使用教程》的基础上,进一步学习Python文件操作库的高级应用。一、高级文件系统监控1.1watchdog库-实时文件系统监控安装与基本使用:...

Python办公自动化系列篇之六:文件系统与操作系统任务

作为高效办公自动化领域的主流编程语言,Python凭借其优雅的语法结构、完善的技术生态及成熟的第三方工具库集合,已成为企业数字化转型过程中提升运营效率的理想选择。该语言在结构化数据处理、自动化文档生成...

14《Python 办公自动化教程》os 模块操作文件与文件夹

在日常工作中,我们经常会和文件、文件夹打交道,比如将服务器上指定目录下文件进行归档,或将爬虫爬取的数据根据时间创建对应的文件夹/文件,如果这些还依靠手动来进行操作,无疑是费时费力的,这时候Pyt...

python中os模块详解(python os.path模块)

os模块是Python标准库中的一个模块,它提供了与操作系统交互的方法。使用os模块可以方便地执行许多常见的系统任务,如文件和目录操作、进程管理、环境变量管理等。下面是os模块中一些常用的函数和方法:...

21-Python-文件操作(python文件的操作步骤)

在Python中,文件操作是非常重要的一部分,它允许我们读取、写入和修改文件。下面将详细讲解Python文件操作的各个方面,并给出相应的示例。1-打开文件...

轻松玩转Python文件操作:移动、删除

哈喽,大家好,我是木头左!Python文件操作基础在处理计算机文件时,经常需要执行如移动和删除等基本操作。Python提供了一些内置的库来帮助完成这些任务,其中最常用的就是os模块和shutil模块。...

Python 初学者练习:删除文件和文件夹

在本教程中,你将学习如何在Python中删除文件和文件夹。使用os.remove()函数删除文件...

引人遐想,用 Python 获取你想要的“某个人”摄像头照片

仅用来学习,希望给你们有提供到学习上的作用。1.安装库需要安装python3.5以上版本,在官网下载即可。然后安装库opencv-python,安装方式为打开终端输入命令行。...

Python如何使用临时文件和目录(python目录下文件)

在某些项目中,有时候会有大量的临时数据,比如各种日志,这时候我们要做数据分析,并把最后的结果储存起来,这些大量的临时数据如果常驻内存,将消耗大量内存资源,我们可以使用临时文件,存储这些临时数据。使用标...

Linux 下海量文件删除方法效率对比,最慢的竟然是 rm

Linux下海量文件删除方法效率对比,本次参赛选手一共6位,分别是:rm、find、findwithdelete、rsync、Python、Perl.首先建立50万个文件$testfor...

Python 开发工程师必会的 5 个系统命令操作库

当我们需要编写自动化脚本、部署工具、监控程序时,熟练操作系统命令几乎是必备技能。今天就来聊聊我在实际项目中高频使用的5个系统命令操作库,这些可都是能让你效率翻倍的"瑞士军刀"。一...

Python常用文件操作库使用详解(python文件操作选项)

Python生态系统提供了丰富的文件操作库,可以处理各种复杂的文件操作需求。本教程将介绍Python中最常用的文件操作库及其实际应用。一、标准库核心模块1.1os模块-操作系统接口主要功能...

11. 文件与IO操作(文件io和网络io)

本章深入探讨Go语言文件处理与IO操作的核心技术,结合高性能实践与安全规范,提供企业级解决方案。11.1文件读写11.1.1基础操作...

Python os模块的20个应用实例(python中 import os模块用法)

在Python中,...