【玩转23种Java设计模式】行为型模式篇:命令模式

软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。
汇总目录链接:【玩转23种Java设计模式】学习目录汇总整理

文章目录

一、简介

命令模式(Command Pattern)是一种行为型设计模式,它将请求封装成对象,从而使得可以使用不同的请求、队列或日志来参数化其他对象,同时支持可撤销的操作。该模式的核心是将"请求"抽象为独立的对象,这样可以更灵活地设计系统的各个模块。

主要角色:

  • Command(命令接口):定义命令执行的接口。
  • ConcreteCommand(具体命令类):实现命令接口,绑定一个接收者并实现具体的动作。
  • Invoker(调用者):持有命令对象并触发执行。
  • Client(客户端):创建命令对象并设置其接收者和调用者。

二、实例

例如:模拟智能家居中的灯光控制场景。

1、命令接口(Command)

java 复制代码
interface Command {
    void execute();
    void undo();
}

2、灯(Light)

java 复制代码
class Light {
    public void on() {
        System.out.println("The light is ON.");
    }

    public void off() {
        System.out.println("The light is OFF.");
    }
}

3、打开灯的命令(LightOnCommand)

java 复制代码
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();
    }
}

4、关闭灯的命令(LightOffCommand)

java 复制代码
class LightOffCommand implements Command {
    private Light light;

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

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

    @Override
    public void undo() {
        light.on();
    }
}

5、遥控器(RemoteControl)

java 复制代码
class RemoteControl {
    private Command command;

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

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

    public void pressUndo() {
        command.undo();
    }
}

6、客户端(CommandPatternExample)

java 复制代码
public class CommandPatternExample {
    public static void main(String[] args) {
        Light livingRoomLight = new Light();

        Command lightOn = new LightOnCommand(livingRoomLight);
        Command lightOff = new LightOffCommand(livingRoomLight);

        RemoteControl remote = new RemoteControl();

        // 打开灯
        remote.setCommand(lightOn);
        remote.pressButton();

        // 撤销操作
        remote.pressUndo();

        // 关闭灯
        remote.setCommand(lightOff);
        remote.pressButton();

        // 撤销操作
        remote.pressUndo();
    }
}

三、总结

1、优点

  • 解耦请求与实现:命令模式将请求的发送者和接收者解耦,使得发送者无需知道接收者的具体实现。
  • 支持撤销与重做:通过在命令类中添加撤销逻辑,可以轻松实现撤销和重做功能。
  • 灵活扩展:可以很方便地新增命令,而不需要修改现有代码。

2、缺点

  • 命令类较多:对于每一个具体操作都需要一个命令类,增加了类的数量和系统复杂性。
  • 请求链复杂:如果命令链较长,可能会导致请求的跟踪和管理变得困难。

3、应用场景

  • 事务性操作:例如数据库操作的撤销和重做。
  • 任务队列系统:将操作排队执行,例如打印队列、任务调度。
  • GUI开发:按钮的点击事件可以通过命令模式封装。
  • 日志记录:记录每个命令的执行,便于系统回滚或重做操作。
相关推荐
4277240014 分钟前
IDEA使用git不提示账号密码登录,而是输入token问题解决
java·git·intellij-idea
chengooooooo36 分钟前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
李长渊哦38 分钟前
常用的 JVM 参数:配置与优化指南
java·jvm
计算机小白一个38 分钟前
蓝桥杯 Java B 组之设计 LRU 缓存
java·算法·蓝桥杯
黑不溜秋的1 小时前
C++ 设计模式 - 策略模式
c++·设计模式·策略模式
付聪12103 小时前
策略模式介绍和代码示例
设计模式
南宫生3 小时前
力扣每日一题【算法学习day.132】
java·学习·算法·leetcode
计算机毕设定制辅导-无忧学长4 小时前
Maven 基础环境搭建与配置(一)
java·maven
ThereIsNoCode5 小时前
「软件设计模式」状态模式(State)
设计模式·状态模式
风与沙的较量丶5 小时前
Java中的局部变量和成员变量在内存中的位置
java·开发语言