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

软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。

汇总目录链接:【玩转23种Java设计模式】学习目录汇总整理

文章目录

  • 一、简介
  • 二、实例
    • 1、命令接口(Command)
    • 2、灯(Light)
    • 3、打开灯的命令(LightOnCommand)
    • 4、关闭灯的命令(LightOffCommand)
    • 5、遥控器(RemoteControl)
    • 6、客户端(CommandPatternExample)
  • 三、总结
    • 1、优点
    • 2、缺点
    • 3、应用场景

一、简介

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

主要角色:

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

二、实例

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

1、命令接口(Command)

interface Command {
    void execute();
    void undo();
}

2、灯(Light)

class Light {
    public void on() {
        System.out.println("The light is ON.");
    }

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

3、打开灯的命令(LightOnCommand)

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)

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)

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)

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开发:按钮的点击事件可以通过命令模式封装。
  • 日志记录:记录每个命令的执行,便于系统回滚或重做操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/946062.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

node.js之---事件循环机制

事件循环机制 Node.js 事件循环机制(Event Loop)是其核心特性之一,它使得 Node.js 能够高效地处理大量并发的 I/O 操作。Node.js 基于 非阻塞 I/O,使用事件驱动的模型来实现异步编程。事件循环是 Node.js 实现异步编程的基础&…

如何在没有 iCloud 的情况下将数据从 iPhone 传输到 iPhone

概括 您可能会遇到将数据从 iPhone 转移到 iPhone 的情况,尤其是当您获得新的 iPhone 15/14 时,您会很兴奋并希望将数据转移到它。 使用iCloud最终可以做到这一点,但它的缺点也不容忽视,阻碍了你选择它。例如,您需要…

HTML——26.像素单位

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>像素</title></head><body><!--像素&#xff1a;1.指设备屏幕上的一个点&#xff0c;单位px&#xff0c;如led屏上的小灯朱2.当屏幕分辨率固定时&…

智能商业分析 Quick BI

Quick BI 是阿里云提供的一款智能商业分析&#xff08;BI&#xff09;工具&#xff0c;旨在帮助企业快速获取业务洞察、优化决策过程、提升数据分析效率。通过强大的数据可视化和分析功能&#xff0c;Quick BI 能够帮助用户轻松连接多种数据源、创建多维度的报表和仪表盘&#…

multisim仿真搭建三极管开关电路,低电平(5V)控制高电平(12V)输出

通过三极管搭建电路&#xff0c;低电平&#xff08;5V&#xff09;控制高电平&#xff08;12V&#xff09;输出 低电平输入&#xff1a;当输入信号为低电平时&#xff08;0V&#xff09;&#xff0c;三极管Q1处于截止状态。上拉电阻R1的存在&#xff0c;Q2输入端被拉到低电平&a…

Python跨年烟花

目录 系列文章 写在前面 技术需求 完整代码 下载代码 代码分析 1. 程序初始化与显示设置 2. 烟花类 (Firework) 3. 粒子类 (Particle) 4. 痕迹类 (Trail) 5. 烟花更新与显示 6. 主函数 (fire) 7. 游戏循环 8. 总结 注意事项 写在后面 系列文章 序号直达链接爱…

LeetCode - 初级算法 数组(删除排序数组中的重复项)

免责声明:本文来源于个人知识与公开资料,仅用于学术交流。 删除排序数组中的重复项 这篇文章讨论如何从一个非严格递增的数组 nums 中删除重复的元素,使每个元素只出现一次,并返回新数组的长度。因为数组是排序的,只要是相同的肯定是挨着的,所以我们需要遍历所有数组,然…

【yolov5】实现FPS游戏人物检测,并定位到矩形框上中部分,实现自瞄

介绍 本人机器学习小白&#xff0c;通过语言大模型百度进行搜索&#xff0c;磕磕绊绊的实现了初步效果&#xff0c;能有一些锁头效果&#xff0c;但识别速度不是非常快&#xff0c;且没有做敌友区分&#xff0c;效果不是非常的理想&#xff0c;但在4399小游戏中爽一下还是可以…

Java jni调用nnom rnn-denoise 降噪

介绍&#xff1a;https://github.com/majianjia/nnom/blob/master/examples/rnn-denoise/README_CN.md 默认提供了一个wav的例子 #include <stdint.h> #include <stdlib.h> #include <stdio.h> #include <math.h> #include <string.h>#include …

Windows系统 系统盘瘦身策略之文件迁移

1 Android Studio 1.1 .android 该文件夹路径一般在 C:\Users\<user_name>\.android 迁移步骤&#xff1a; ①关闭 Android Studio ②打开环境变量设置&#xff0c;添加以下环境变量 变量名&#xff1a;ANDROID_SDK_HOME 变量值&#xff1a;你自己的路径【不用单独创建.…

SQLiteDataBase数据库

XML界面设计 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:layout_width"match_paren…

Midjourney技术浅析(七):图像风格化

Midjourney 通过风格迁移&#xff08;Style Transfer&#xff09;和图像滤镜&#xff08;Image Filters&#xff09;技术&#xff0c;使用户能够将生成的图像转换为不同的艺术风格或视觉效果。 一、风格迁移&#xff08;Style Transfer&#xff09; 1.1 风格迁移的定义 风格…

Edge安装问题,安装后出现:Could not find Edge installation

解决&#xff1a;需要再安装&#xff08;MicrosoftEdgeWebView2RuntimeInstallerX64&#xff09;。 网址&#xff1a;https://developer.microsoft.com/zh-cn/microsoft-edge/webview2/?formMA13LH#download 如果已经安装了edge&#xff0c;那就再下载中间这个独立程序安装就…

【JAVA高级篇教学】第六篇:Springboot实现WebSocket

在 Spring Boot 中对接 WebSocket 是一个常见的场景&#xff0c;通常用于实现实时通信。以下是一个完整的 WebSocket 集成步骤&#xff0c;包括服务端和客户端的实现。本期做个简单的测试用例。 目录 一、WebSocket 简介 1. 什么是 WebSocket&#xff1f; 2. WebSocket 的特…

Painter-Mortadela靶场

信息收集 枚举端口 nmap 192.168.109.132 -sS -sV -min-rate 5000 -Pn -p- -p- &#xff1a;扫描所有端口。 (65535)-sS&#xff1a;执行TCP SYN 扫描以快速扫描哪些端口打开。-sC&#xff1a;使用基本识别脚本执行扫描-sV&#xff1a;执行服务扫描–min-rate 5000&#xff1…

攻防世界pwn刷题

get_shell 这题直接给shell了 exp from pwn import* p remote(61.147.171.105,59682) p.sendline(cat flag) p.interactive() cyberpeace{8cd678c722f48327a69b2661ae8956c8} hello_pwn checksec一下 ok&#xff0c;64位的 {alarm(0x3Cu);setbuf(stdout, 0LL);puts("…

1、pycharm、python下载与安装

1、去官网下载pycharm 官网&#xff1a;https://www.jetbrains.com/pycharm/download/?sectionwindows 2、在等待期间&#xff0c;去下载python 进入官网地址&#xff1a;https://www.python.org/downloads/windows/ 3、安装pycharm 桌面会出现快捷方式 4、安装python…

epoll的ET和LT模式

LevelTriggered&#xff1a;简称LT&#xff0c;当FD有数据可读时&#xff0c;会重复通知多次&#xff0c;直至数据处理完成。是epoll的默认模式EdgeTriggered&#xff1a;简称ET&#xff0c;当FD有数据可读时&#xff0c;只通知一次&#xff0c;不管数据是否处理完成 Level是指…

CSS利用浮动实现文字环绕右下角,展开/收起效果

期望实现 文字最多展示 N 行&#xff0c;超出部分截断&#xff0c;并在右下角显示 “…” “更多”&#xff1b; 点击更多&#xff0c;文字展开全部内容&#xff0c;右下角显示“收起”。效果如下&#xff1a; 思路 尽量使用CSS控制样式&#xff0c;减少JS代码复杂度。 利…

单元测试入门和mockup

Java 新手入门&#xff1a;Java单元测试利器&#xff0c;Mock详解_java mock-CSDN博客 这个是典型的before when assert三段式&#xff0c;学一下单测思路 这个没有动态代理&#xff0c;所以是直接class(对比下面) Jmockit使用笔记_增加代码覆盖率_覆盖try catch_使用new Mock…