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

【设计模式】命令模式

简介

假设你有一个智能家居遥控器,上面有多个按钮,每个按钮对应不同的设备操作(如开灯、关灯、调空调温度)。
命令模式的解决方案是:

  1. 将每个操作(如“开灯”)封装成一个独立的命令对象,包含执行和撤销方法。
  2. 遥控器(调用者)不直接控制设备,而是通过触发命令对象来间接操作设备。
  3. 你可以灵活地为按钮更换命令,甚至实现“一键多操作”或“撤销”功能。

适用场景

  1. 需要将请求发送者与接收者解耦(如菜单项触发不同操作)。
  2. 支持请求的排队、撤销/重做、日志记录(如文本编辑器的撤销功能)。
  3. 需要支持宏命令(一键执行多个命令)。

优点

  1. 解耦请求发送者和接收者,增强扩展性。
  2. 支持撤销、重做、事务等复杂操作。

缺点

  1. 每个命令需单独实现类,增加代码量。
  2. 复杂命令可能引入多层嵌套逻辑。

类图

在这里插入图片描述

代码

// 命令接口

interface Command {

    void execute();

    void undo();

}

  

// 接收者:灯

class Light {

    public void on() {

        System.out.println("灯已打开");

    }

    public void off() {

        System.out.println("灯已关闭");

    }

}

  

// 具体命令:开灯

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();

    }

}

  

// 调用者:遥控器按钮

class RemoteControl {

    private Command command;

    public void setCommand(Command command) {

        this.command = command;

    }

    public void pressButton() {

        command.execute();

    }

    public void pressUndo() {

        command.undo();

    }

}

  

// 客户端

public class CommandDemo {

    public static void main(String[] args) {

        Light light = new Light();

        Command lightOn = new LightOnCommand(light);

        RemoteControl remote = new RemoteControl();

        remote.setCommand(lightOn);

        remote.pressButton();   // 执行命令

        remote.pressUndo();    // 撤销命令

    }

}

应用场景

数据库事务中的操作可通过命令模式实现,支持执行与回滚。

import java.util.Stack;


// 事务命令接口

interface TransactionCommand {

    void execute();

    void rollback();

}

  

// 接收者:数据库操作

class Database {

    public void insert(String data) {

        System.out.println("插入数据: " + data);

    }

    public void delete(String data) {

        System.out.println("删除数据: " + data);

    }

}

  

// 具体命令:插入操作

class InsertCommand implements TransactionCommand {

    private Database db;

    private String data;

    public InsertCommand(Database db, String data) {

        this.db = db;

        this.data = data;

    }

    @Override

    public void execute() {

        db.insert(data);

    }

    @Override

    public void rollback() {

        db.delete(data);

    }

}

  

// 事务管理器(支持回滚)

class TransactionManager {

    private Stack<TransactionCommand> history = new Stack<>();

    public void submit(TransactionCommand command) {

        command.execute();

        history.push(command);

    }

    public void rollbackAll() {

        while (!history.isEmpty()) {

            history.pop().rollback();

        }

    }

}

  

// 客户端

public class TransactionDemo {

    public static void main(String[] args) {

        Database db = new Database();

        TransactionManager manager = new TransactionManager();

        manager.submit(new InsertCommand(db, "A"));

        manager.submit(new InsertCommand(db, "B"));

        System.out.println("\n回滚事务:");

        manager.rollbackAll();

    }

}

http://www.dtcms.com/a/113718.html

相关文章:

  • mine craft经典信封
  • 力扣刷题-热题100题-第31题(c++、python)
  • 博途 TIA Portal之1200做主站与200SMART的S7通讯
  • 《减压宝典》Python篇
  • leetcode每日一题:替换子串得到平衡字符串
  • vue3实现markdown预览和编辑
  • Cursor 无限续杯 Windows版
  • 智能体开发实战指南:提示词设计、开发框架与工作流详解
  • ROS多设备交互
  • 用C语言控制键盘上的方向键
  • LightRAG核心原理和数据流
  • Cisco Packet Tracer 8.0(新版)
  • 【神经网络】python实现神经网络(三)——正向学习的模拟演练
  • Unity插件SuperScrollView详解(进阶篇)
  • MySQL篇(五)MySQL主从同步原理深度剖析
  • 面试算法高频03-递归
  • day 8 TIM定时器
  • 第八章 Python基础进阶-数据可视化(终)
  • FfreeRTOS有阻塞作用的API
  • 12款字重国外法国风格复古报纸日历设计衬线英文字体安装包 Claire Font Family
  • docker swarm常用命令
  • python爬虫爬取淘宝热销(热门)男装商品信息(课程设计;提供源码、使用说明文档及相关文档;售后可联系博主)
  • Rust切片、结构体、枚举
  • macOS下SourceInsight的替代品
  • 前端工程化之模块化开发 webpack
  • 完整的Python程序,它能够根据两个Excel表格(假设在同一个Excel文件的不同sheet中)中的历史数据来预测未来G列数字
  • #C8# UVM中的factory机制 #S8.1.1# 多态的实现方式(三)
  • LeetCode-98. 验证二叉搜索树
  • java流程控制06:While循环
  • HeidiSQL:多数据库管理工具