【玩转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开发:按钮的点击事件可以通过命令模式封装。
  • 日志记录:记录每个命令的执行,便于系统回滚或重做操作。
相关推荐
lennon_jlu8 分钟前
1.4 java反射机制 简单的java反射机制实践
java·开发语言·python
luoluoal10 分钟前
java项目之社区医院信息平台源码(springboot+mysql)
java·开发语言
对,就是哥23 分钟前
ABAP弹出对对话框错误信息设计
java·数据库·算法
_.Switch36 分钟前
FastAPI 响应模型与自定义响应
开发语言·前端·数据库·python·fastapi·命令模式
傻啦嘿哟39 分钟前
Python多线程与类方法的交互:锁提升安全性的奥秘
java·开发语言
已是上好佳1 小时前
java实验4 反射机制
java·开发语言
小园子的小菜1 小时前
Rockect基于Dledger的Broker主从同步原理
java·开发语言
鹿屿二向箔1 小时前
【论文+源码】创建一个基于Spring Boot的体育场管理系统
java·spring boot·后端
漫无目的行走的月亮1 小时前
Spring boot实现图片上传和下载
java·spring boot
Libby博仙1 小时前
asp.net core Web Api中的数据绑定
java·前端·asp.net