【设计模式】命令模式

简介: 欢迎来到【设计模式】系列博客,今天我们将探讨其中一种重要的设计模式——命令模式。设计模式是软件开发中解决常见问题的最佳实践,而命令模式则是其中一种非常实用的设计模式,它可以帮助我们更好地组织和管理请求或命令。在本篇博客中,我们将详细介绍命令模式的定义、特点、使用场景以及实现方式。通过具体的案例和实践,我们将深入了解命令模式在实际项目中的应用和优势。同时,我们还将分享一些注意事项和最佳实践,以帮助您更好地理解和应用命令模式。

 其他系列文章导航

Java基础合集

数据结构与算法合集

设计模式合集

多线程合集

分布式合集

ES合集


文章目录

其他系列文章导航

文章目录

前言

一、什么是命令模式?

二、命令模式的优点和应用场景

三、命令模式的要素和实现

3.1 命令

3.2 具体命令

3.3 接受者

3.4 调用者

3.5 客户端

四、总结


前言

欢迎来到【设计模式】系列博客,今天我们将探讨其中一种重要的设计模式——命令模式。

设计模式是软件开发中解决常见问题的最佳实践,而命令模式则是其中一种非常实用的设计模式,它可以帮助我们更好地组织和管理请求或命令。

在本篇博客中,我们将详细介绍命令模式的定义、特点、使用场景以及实现方式。通过具体的案例和实践,我们将深入了解命令模式在实际项目中的应用和优势。同时,我们还将分享一些注意事项和最佳实践,以帮助您更好地理解和应用命令模式。

希望通过本篇博客的学习,您能够掌握命令模式的基本概念和用法,并在实际项目中灵活运用这一设计模式,提高软件的质量和效率。


一、什么是命令模式?

命令模式是一种行为型设计模式,核心是将每种请求或操作封装为一个独立的对象,从而可以集中管理这些请求或操作,比如将请求队列化依次执行、或者对操作进行记录和撤销。

命令模式通过将请求的发送者(客户端)和接收者(执行请求的对象)解耦,提供了更大的灵活性和可维护性。

image.gif编辑


二、命令模式的优点和应用场景

命令模式最大的优点就是解耦请求发送者和接受者,让系统更加灵活、可扩展。

由于每个操作都是一个独立的命令类,所以我们需要新增命令操作时,不需要改动现有代码。

命令模式典型的应用场景:

    • 系统需要统一处理多种复杂的操作,比如操作排队、记录操作历史、撤销重做等。
    • 系统需要持续增加新的命令、或者要处理复杂的组合命令(子命令),使用命令模式可以实现解耦。

    image.gif编辑


    三、命令模式的要素和实现

    3.1 命令

    相当于遥控器操作按钮的制作规范

    命令是一个抽象类或接口,它定义了执行操作的方法,通常是execute,该方法封装了具体的操作。

    public interface Command {
        void execute();
    }

    image.gif

    3.2 具体命令

    相当于遥控器的某个操作按钮

    具体命令是命令接口的具体实现类,它负责将请求传递给接收者(设备)并执行具体的操作。

    比如定义一个关闭设备命令:

    public class TurnOffCommand implements Command {
        private Device device;
        public TurnOffCommand(Device device) {
            this.device = device;
        }
        public void execute() {
            device.turnOff();
        }
    }

    image.gif

    还可以定义开启设备命令:

    public class TurnOnCommand implements Command {
        private Device device;
        public TurnOnCommand(Device device) {
            this.device = device;
        }
        public void execute() {
            device.turnOn();
        }
    }

    image.gif

    3.3 接受者

    相当于被遥控的设备

    接收者是最终执行命令的对象,知道如何执行具体的操作。

    比如定义一个设备类:

    public class Device {
        private String name;
        public Device(String name) {
            this.name = name;
        }
        public void turnOn() {
            System.out.println(name + " 设备打开");
        }
        public void turnOff() {
            System.out.println(name + " 设备关闭");
        }
    }

    image.gif

    3.4 调用者

    相当于遥控器

    作用是接受客户端的命令并执行。

    比如定义遥控器类:

    public class RemoteControl {
        private Command command;
        public void setCommand(Command command) {
            this.command = command;
        }
        public void pressButton() {
            command.execute();
        }
    }

    image.gif

    以上只是最基础的调用者类,还可以给遥控器类增加更多能力,比如存储历史记录、撤销重做等。

    3.5 客户端

    相当于使用遥控器的人

    客户端的作用是创建命令对象并将其与接收者关联(绑定设备),然后将命令对象传递给调用者(按遥控器),从而触发执行。

    示例客户端:

    public class Client {
        public static void main(String[] args) {
            // 创建接收者对象
            Device tv = new Device("TV");
            Device stereo = new Device("Stereo");
            // 创建具体命令对象,可以绑定不同设备
            TurnOnCommand turnOn = new TurnOnCommand(tv);
            TurnOffCommand turnOff = new TurnOffCommand(stereo);
            // 创建调用者
            RemoteControl remote = new RemoteControl();
            // 执行命令
            remote.setCommand(turnOn);
            remote.pressButton();
            remote.setCommand(turnOff);
            remote.pressButton();
        }
    }

    image.gif

    在这个示例中,命令模式将遥控器按钮的按下操作与实际设备的开关操作解耦,从而实现了灵活的控制和可扩展性。

    整个程序的 UML 类图如下:

    image.gif编辑


    四、总结

    在软件开发中,我们经常需要处理各种请求或命令,这些请求或命令可能是来自用户、系统或其他组件。

    如何有效地管理和处理这些请求或命令,对于提高软件的可维护性和可扩展性至关重要。命令模式可以帮助我们实现这一目标。

    命令模式的主要思想是将请求或命令封装成一个对象,从而将发出请求的客户端与接收请求的服务端操作解耦。

    这样,我们可以将请求或命令传递给服务端进行相应的处理,而不必直接依赖于服务端的具体实现。同时,通过将请求或命令封装成对象,我们可以更好地组织和管理这些请求或命令,提高代码的可读性和可维护性


    目录
    相关文章
    |
    7月前
    |
    设计模式 UED
    二十三种设计模式:解锁软件开发的神器:命令模式与撤销重做功能
    二十三种设计模式:解锁软件开发的神器:命令模式与撤销重做功能
    173 0
    |
    3月前
    |
    设计模式 存储 算法
    Java设计模式-命令模式(16)
    Java设计模式-命令模式(16)
    |
    4月前
    |
    设计模式 存储 Java
    【十二】设计模式~~~行为型模式~~~命令模式(Java)
    文章详细介绍了命令模式(Command Pattern),这是一种对象行为型模式,用于将请求封装成对象,实现请求发送者与接收者的解耦,从而降低系统耦合度、提高灵活性,并支持命令的排队、记录、撤销和恢复操作。通过案例分析、结构图、时序图和代码示例,文章展示了命令模式的组成部分、实现方式和应用场景,并讨论了其优点、缺点和适用情况。
    |
    5月前
    |
    设计模式 JavaScript API
    js设计模式【详解】—— 命令模式
    js设计模式【详解】—— 命令模式
    47 6
    |
    6月前
    |
    设计模式
    命令模式-大话设计模式
    命令模式-大话设计模式
    |
    6月前
    |
    设计模式 Java uml
    必知的技术知识:JAVA【设计模式】命令模式
    必知的技术知识:JAVA【设计模式】命令模式
    30 0
    |
    6月前
    |
    设计模式 Java
    Java设计模式之命令模式详解
    Java设计模式之命令模式详解
    |
    6月前
    |
    设计模式
    设计模式之命令模式
    设计模式之命令模式
    |
    7月前
    |
    设计模式 Java 调度
    【设计模式系列笔记】命令模式
    命令模式是一种行为设计模式,它将请求封装成一个对象,从而允许使用不同的请求、队列或日志请求参数化客户端对象,同时支持撤销操作。
    72 1
    |
    7月前
    |
    设计模式 Java 调度
    小谈设计模式(24)—命令模式
    小谈设计模式(24)—命令模式