java设计模式(十五)命令模式(Command Pattern)

news2025/3/2 4:23:23

1、模式介绍:

命令模式(Command Pattern)是一种行为设计模式,其主要目的是将请求封装成一个对象,从而允许使用不同的请求、队列或者日志来参数化其他对象。这种模式使得命令的请求者和实现者解耦。

2、应用场景:

需要将请求发送者和接收者解耦:命令模式将请求封装成对象,使得发送者和接收者彼此独立,发送者不需要知道接收者的具体操作。
需要在不同的时间指定请求、排队请求、记录请求:命令模式允许将操作请求封装成对象,从而使得可以参数化其他对象来执行不同的请求、将请求排队、记录日志等。

3、优点:

降低系统耦合度:命令模式将请求者与接收者解耦,请求者无需知道接收者的详细信息。
新增或修改命令更加灵活:可以新增命令类或修改命令参数,而不影响到其他类。
支持撤销和重做操作:通过保存历史命令可以实现撤销和重做操作。

4、缺点:

命令类可能会增加系统复杂度:每一个命令都需要设计一个具体命令类,可能会导致类的数量增加。
可能会导致系统产生大量的具体命令类:如果命令操作很多,可能会产生大量的具体命令类。

5、代码示例:

/**
 * 命令接口
 *
 * @author FM_南风
 * @date 2024/7/5
 */
public interface Command {
    void execute();
}

/**
 * 接收者类 - 灯
 *
 * @author FM_南风
 * @date 2024/7/5
 */
public class Light {
    public void turnOn() {
        System.out.println("灯已打开");
    }

    public void turnOff() {
        System.out.println("灯已关闭");
    }
}

/**
 * 具体命令类 - 关灯命令
 *
 * @author FM_南风
 * @date 2024/7/5
 */
public class LightOffCommand implements Command {
    private Light light;

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

    public void execute() {
        light.turnOff();
    }
}

/**
 * 具体命令类 - 开灯命令
 *
 * @author FM_南风
 * @date 2024/7/5
 */
public class LightOnCommand implements Command{
    private Light light;

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

    public void execute() {
        light.turnOn();
    }
}

/**
 * 调用者类 - 遥控器
 *
 * @author FM_南风
 * @date 2024/7/5
 */
public class RemoteControl {
    private Command command;

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

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

/**
 * 应用
 *
 * @author FM_南风
 * @date 2024/7/5
 */
public class CommandClient {
    public static void main(String[] args) {
        // 创建灯对象
        Light light = new Light();

        // 创建具体命令对象
        Command turnOnCommand = new LightOnCommand(light);
        Command turnOffCommand = new LightOffCommand(light);

        // 创建遥控器对象
        RemoteControl remoteControl = new RemoteControl();

        // 设置命令并执行
        remoteControl.setCommand(turnOnCommand);
        remoteControl.pressButton(); // 打开灯

        remoteControl.setCommand(turnOffCommand);
        remoteControl.pressButton(); // 关闭灯
    }
}

6、结果展示:

7、示例说明:

在这个示例中:
Command 是命令接口,定义了执行命令的方法 execute
LightOnCommand 和 LightOffCommand 是具体的命令类,分别用于开灯和关灯操作。
Light 是接收者类,定义了实际的操作方法。
RemoteControl 是调用者类,通过 setCommand 方法设置命令,通过 pressButton 方法执行命令。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

王道计算机数据结构+插入排序、冒泡排序、希尔排序、快速排序、简单选择排序

本内容是基于王道计算机数据结构的插入排序、冒泡排序、希尔排序、快速排序、简单选择排序整理。 文章目录 插入排序算法性能代码 冒泡排序算法性能代码 希尔排序算法性能代码 快速排序算法性能代码 简单选择排序算法性能代码 插入排序 算法 算法思想:每次将一个…

谷歌报告显示:2023 年 50% 的0day漏洞利用背后都是间谍软件供应商

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 导 读 谷歌威胁分析小组 (TAG) 和谷歌子公司 Mandiant 表示,他们观察到 2023 年攻击中利用的0day漏洞…

骑行耳机有哪些品牌值得入手?盘点5大品质与口碑兼顾的耳机推荐!

骨传导耳机凭借卓越的骑行兼容性,赢得了众多骑行爱好者的青睐,然而,关于骨传导耳机导致佩戴不适或影响骑行安全的反馈却屡见不鲜。这一看似矛盾的现象,实则源于市场被众多非专业骨传导耳机品牌充斥,尤其是一些标榜专为…

LLMs可以进行任务规划吗?如果不行,LLMs+GNN可以吗?

深度图学习与大模型LLM(小编): 大家好,今天向大家介绍一篇最新发布的研究论文(20240530)。这篇论文探讨了如何通过引入GNN来提高大模型在任务规划(task planning)中的性能。*论文分析了LLMs在任务规划上的局限性,并提出了一种简单而有效的解决方案。* 1.…

【面试题】防火墙的部署模式有哪些?

防火墙的部署模式多种多样,每种模式都有其特定的应用场景和优缺点。以下是防火墙的主要部署模式: 一、按工作模式分类 路由模式 定义:当防火墙位于内部网络和外部网络之间时,需要将防火墙与内部网络、外部网络以及DMZ&#xff0…

昇思学习打卡-17-热门LLM及其他AI应用/基于MobileNetv2的垃圾分类

文章目录 网络介绍读取数据集训练训练策略模型保存损失函数优化器模型训练 网络介绍 MobileNetv2专注于移动端、嵌入式或IoT设备的轻量级CNN网络。MobileNet网络使用深度可分离卷积(Depthwise Separable Convolution)的思想在准确率小幅度降低的前提下&…

九.核心动画 - 显式动画

引言 本篇博客紧接着上一篇的隐式动画开始介绍显式动画。隐式动画是创建动态页面的一种简单的直接的方式,也是UIKit的动画机制基础。但是它并不能涵盖所有的动画类型。 显式动画 接下来我们就来研究另外一种动画显式动画,它能够对一些属性做指定的动画…

北斗GPS天线使用技巧与性能对比

北斗GPS天线使用中注意的问题 多系统兼容性:确保天线不仅能接收北斗信号,还能同时接收其他GNSS系统(如GPS、GLONASS、Galileo)的信号,以提高定位精度和可靠性。 信号频率选择:根据应用需求选择合适的信号…

【RHCE】实验(HTTP,DNS,SELinux,firewalld的运用)

一、题目 二、主服务器配置 1.下载HTTP服务,DNS服务 [rootlocalhost ~]# yum install -y httpd bind 2.开启防火墙,放行服务 # 开启防火墙 [rootlocalhost ~]# systemctl start firewalld # 放行服务 [rootlocalhost ~]# firewall-cmd --add-service…

【linux服务器】大语言模型实战教程:LLMS大模型快速部署到个人服务器

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引言 说到大语言模型相信大家都不会陌生,大型语言模型(LLMs)是人工智能文本处理的主要类型,也现在最流行的人工智能…

市场趋势的智能预测:Kompas.ai如何洞察未来市场动向

在商业领域,市场趋势预测是企业制定战略规划和做出明智决策的关键。准确把握市场动向能够帮助企业及时调整战略,抓住机遇,规避风险。Kompas.ai,一款先进的人工智能市场分析工具,正通过其深度学习和数据分析能力&#x…

漏洞中有三分之一具有严重且高风险

首发公众号网络研究观,微信搜索关注每日获取更多内容。 在大多数项目中,发现了低复杂度(38%)和中等复杂度(50%)的攻击向量,即使是低技能的黑客也可以执行这些攻击向量。 Positive Technologie…

变量和常量(局部变量和全局变量)

常变的值叫变量,不变的值叫常量 变量分为局部变量和全局变量 在同一范围内,变量只能定义一次,否则就会报错 全部变量和局部变量是可以同时存在的,不过使用的时候是局部优先 变量如果你不给他初始化,那么他放得就是一…

ICC2:如何检查input floating

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 input floating分为两种情况: input没接net的情况: get_flat_pins -f "direction ==in && undefined(net)" input接net…

解决fidder小黑怪倒出JMeter文件缺失域名、请求头

解决fidder小黑怪倒出JMeter文件缺失域名、请求头 1、目录结构: 2、代码 coding:utf-8 Software:PyCharm Time:2024/7/10 14:02 Author:Dr.zxyimport zipfile import os import xml.etree.ElementTree as ET import re#定义信息头 headers_to_extract [Host, Conn…

springboot轻松音乐-计算机毕业设计源码48092

目 录 摘要 1 绪论 1.1研究背景与意义 1.2研究现状 1.3论文结构与章节安排 2 基于微信小程序的轻松音乐系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.3 系统用例分析 2.4 系统…

将charles证书放置根文件夹目录下

一:证书导出重命名 先将charles证书导出,然后使用下列命令将charles证书文件重命名 openssl x509 -inform DER -subject_hash_old -in FiddlerRoot.cer 将文件命名为e5472ab9.0 二:文件移动 我在一台pixcel 5尝试将charles证书移动到安卓跟文件目录下,即显示文件只可读不可…

知识链:知识图谱提升大模型的推理能力,解决多个知识点结合推理时出错

知识链:知识图谱提升大模型的推理能力,解决多个知识点结合推理时出错 提出背景解法拆解逻辑链 CoK 框架hop 步骤处理肺炎疑似病例2-hop规则的应用3-hop规则的应用4-hop规则的应用CoK(T&E)方法的优势 CoK 算法步骤数据集构建 知…

什么是工业4.0?

在当今这个日新月异的时代,科技的每一次飞跃都深刻地改变着我们的生活与工作方式。而在这场全球性的变革中,工业4.0不仅代表了制造业的未来趋势,更是全球经济发展的新引擎。那么,究竟什么是工业4.0?它如何重塑我们的工…

nginx正向代理、反向代理、负载均衡

nginx.conf nginx首要处理静态页面 反向代理 动态请求 全局模块 work processes 1; 设置成服务器内核数的两倍(一般不不超过8个超过8个反而会降低性能一般4个 1-2个也可以) netstat -antp | grep 80 查端口号 *1、events块:* 配置影响ngi…