设计模式-14命令模式

C++设计模式14:命令模式 命令模式(Command)是一种行为型设计模式,它将请求封装成一个对象,从而允许您将不同的请求参数化,并将客户端代码与具体的请求解耦。这种模式的核心思想是将请求的发送者和接收者分离,从而使它们可以独立地变化。在命令模式中,有四个主要的角色:命令接口、具体命令、调用者和接收者。命令接口定义了所有具体命令都必须实现的方法,而具体命令则实现了这些方法,并将一个接收者对象绑定到了自己身上。调用者对象负责将具体命令对象传递给接收者对象,并在需要的时候调用具体命令对象的方法。接收者对象则执行具体命令对象所定义的操作。 阅读详情

命令模式

介绍:
  • 命令模式:在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需要在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式进行设计
  • 命令模式使得请求的发送者和接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活,实现解耦
  • 在命令模式中,会将一个请求封装成一个对象,以便使用不同参数来表示不同的请求,同时命令模式也支持撤销的操作
  • 命令模式主要角色有,invoker是调用者,receiver是调用者,concreteCommand是具体命令,command是接口,持有接收对象
原理类图:

在这里插入图片描述

角色说明:
  • invoker:调用者角色
  • Command:命令角色,需要执行的所有命令都在这,可以是接口或抽象类
  • Receiver:接收者角色,知道如何实施和执行一个请求相关的操作
  • ConcreteCommand:经一个接收者对象和一个动作绑定,调用接收者相应的操作实现execute方法
案例:

命令模式实现智能家电项目

案例图:
在这里插入图片描述

public interface Command {

    void execute();

    void undo();
}


/**
 * concrete command
 */
public class LightOnCommand implements Command {

    private LightReceiver lightReceiver;

    public LightOnCommand(LightReceiver lightReceiver) {
        this.lightReceiver = lightReceiver;
    }

    @Override
    public void execute() {
        lightReceiver.on();
    }

    @Override
    public void undo() {
        lightReceiver.off();
    }
}

public class LightOffCommand implements Command {

    private LightReceiver lightReceiver;

    public LightOffCommand(LightReceiver lightReceiver) {
        this.lightReceiver = lightReceiver;
    }
    @Override
    public void execute() {
        lightReceiver.off();
    }

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

/**
 * 命令接收者(灯)
 */
public class LightReceiver {
    public void on(){
        System.out.println("电灯打开。。。");
    }
    public void off(){
        System.out.println("电灯关闭。。。");
    }
}

public class TvOnCommand implements Command {
    private TVReceiver tvReceiver;

    public TvOnCommand(TVReceiver tvReceiver) {
        this.tvReceiver = tvReceiver;
    }

    @Override
    public void execute() {
        tvReceiver.on();
    }

    @Override
    public void undo() {
        tvReceiver.off();
    }
}

public class TvOffCommand implements Command {
    private TVReceiver tvReceiver;

    public TvOffCommand(TVReceiver tvReceiver) {
        this.tvReceiver = tvReceiver;
    }

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

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

public class TVReceiver {
    public void on(){
        System.out.println("电视打开。。。");
    }
    public void off(){
        System.out.println("电视关闭。。。");
    }
}


/**
 * 空命令,用于命令初始化,调用改方法对象什么也不做,
 * 其实也是一种设计模式,可以省略掉对空判断
 */
public class NoCommand implements Command {
    @Override
    public void execute() {

    }

    @Override
    public void undo() {

    }
}

public class RemoteControl {
    private Command[] onCommands;
    private Command[] offCommands;

    private Command undoCommand;

    public RemoteControl() {
        this.onCommands = new Command[5];
        this.offCommands = new Command[5];
        for (int i = 0; i < 5; i++) {
            onCommands[i] = new NoCommand();
            offCommands[i] = new NoCommand();
        }
    }

    public void setCommands(int index,Command onCommand,Command offCommand){
        onCommands[index] = onCommand;
        offCommands[index] = offCommand;
    }
    //按下开按钮
    public void onButtonPushed(int index){
        onCommands[index].execute();
        //记录上次操作,用于回滚
        undoCommand = onCommands[index];
    }
    //按下关按钮
    public void offButtonPushed(int index){
        offCommands[index].execute();
        //记录上次操作,用于回滚
        undoCommand = offCommands[index];
    }
    //按下撤销按钮
    public void undoButtonPushed(){
        undoCommand.undo();
    }
}

public class Client {
    public static void main(String[] args) {
        //创建接收者对象
        LightReceiver lightReceiver = new LightReceiver();
        //创建开关命令
        LightOnCommand lightOnCommand = new LightOnCommand(lightReceiver);
        LightOffCommand lightOffCommand = new LightOffCommand(lightReceiver);
        //创建命令发布者
        RemoteControl remoteControl = new RemoteControl();
        //给我们的遥控器设置命令,比如0是电灯的开关操作
        remoteControl.setCommands(0,lightOnCommand,lightOffCommand);
        System.out.println("-----------------按下灯的开按钮------------------------");
        remoteControl.onButtonPushed(0);
        System.out.println("-----------------按下灯的关按钮------------------------");
        remoteControl.offButtonPushed(0);
        System.out.println("-----------------按下撤销开按钮------------------------");
        remoteControl.undoButtonPushed();
        //扩展性很强,复合OCP原则,只需要增加TV相关的接收者和命令实现者类即可
        TVReceiver tvReceiver = new TVReceiver();
        TvOnCommand tvOnCommand = new TvOnCommand(tvReceiver);
        TvOffCommand tvOffCommand = new TvOffCommand(tvReceiver);
        remoteControl.setCommands(1,tvOnCommand,tvOffCommand);
        System.out.println("-----------------按下TV的开按钮------------------------");
        remoteControl.onButtonPushed(1);
        remoteControl.offButtonPushed(1);
        remoteControl.undoButtonPushed();
    }
}
命令模式注意事项和细节:
  • 将发起请求的对象和执行请求的对象解耦,发起请求的对象是调用者,调用者只要调用命令对象的execute方法就可以让接收者工作,而不必知道具体的接收者对象是谁,是如何实现的,命令对象会负责让接收者执行请求的动作,也就是说请求发起者和请求执行者之间的解耦是通过命令对象实现的,命令对象起到了纽带桥梁的作用
  • 容易设计一个命令队列,只要把命令对象放到队列,就可以多线程的执行命令
  • 容易实现对请求的撤销和重做
  • 命令模式不足:可能导致某些系统过多的具体的命令类,增加了系统的复杂度,这点在使用时需要注意
  • 空命令也是一种设计模式,它为我们省去了判空的操作,在上面的实例中,如果没有空命令,我们没按下一个按钮都要判空,这个给编码带了一定的麻烦
  • 命令模式经典使用场景:界面的一个按钮就是一个命令、模拟CMD(DOS命令)、触发-反馈机制、订单的撤销/恢复
Dify工作流教程|以抓取网页并更新知识库为例详细讲解工作流编排过程(附DSL文件) {"name": "{新建的title变量}","text": "新建的content变量","indexing_technique": "high_quality","process_rule": {"mode": "automatic"}}有没有很痛苦,明明添加书签的网页,当你想阅读的时候,总是找不到或者好不容易找到了,发现网页404了。如果有个小工具,直接能把你输入的链接内容抓取下来,并且加入到你的知识库中,你说他香不香。无法获取授权的,也可以使用网页抓取工具,这个是免费的,抓取效果也可以。 阅读详情

相关推荐

记录汇川:自由口通信-梯形图

最常见的就是MODBUS通信协议,指令主要通过RS232和RS485端口进行报文发送,所以通信报文格式可以选择MODBUS RTU通信格式或MODBUS ASCII通信格式。255---Y10-Y17:ON(1111 1111)指令进行报文的发送与接收,但是报文内部的数据格式不是由主站PLC决定, 而是由。修改从站一个保持寄存器数据。修改从站多个保持寄存器数据。读取从站的输出信号状态。读取从站的输入信号状态。读取从站保持寄存器数据。读取从站输入寄存器数据。

m0_61837027的博客 4912

设计模式精讲 Day 14:命令模式(Command Pattern)

命令模式(Command Pattern)是一种行为型设计模式,它将一个请求封装成一个对象,从而使你可以在不同的请求之间进行参数化传递,或者将请求排队、记录日志、撤销操作等。核心思想将请求的发送者与接收者解耦,使得请求可以被参数化、记录、撤销或重放。/*** 命令接口:定义执行操作的抽象方法*//*** 接收者:执行具体业务逻辑的对象*//*** 具体命令类:实现Command接口,持有接收者的引用*/@Override// 调用接收者的业务方法/**

在未来等你的专栏 746

告别纯文本RAG:用Dify 1.11.0多模态知识库,5步搭建一个能“读图”的智能客服助手

本文详细介绍了如何利用Dify 1.11.0多模态知识库构建智能视觉客服助手,通过5个步骤实现图片内容理解与专业回复。从准备多模态素材到配置知识库节点,再到设计工作流逻辑和性能优化,帮助开发者快速搭建高效客服系统,显著提升用户体验和问题解决效率。

weixin_30832143的博客 451

【C#设计模式】14.命令模式(Command Pattern)【行为型】

1.1 动机(Motivate) 在软件构建过程中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合——比如需要对行为进行“记录、撤销/重做(undo/redo)、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。 1.2 意图(Intent) 将一个请求封装为一个对象,从而使你可用不同的请求对客户(客户程序,也是行为的请求者)进行参数化;对请求排队或记录请求日志,以及支持可撤销的操..

星Yeah 的博客 2558

手把手教你用OpenRouter免费模型:从DeepSeek V3.1到Llama 3.3的实战指南

本文详细介绍了如何利用OpenRouter平台免费接入DeepSeek V3.1、Llama 3.3等53个AI模型,提供从账号注册到实战应用的完整指南。通过文本摘要、客服对话生成和代码生成等具体案例,帮助开发者高效利用免费模型资源,提升AI应用开发效率。

weixin_29258297的博客 3546

从桨叶设计到电机匹配:手把手教你调出无人机最佳动力组合

本文系统介绍了无人机动力系统的核心匹配原则,重点解析了如何通过测试与数据分析,优化螺旋桨与电机的组合,从而显著提升系统力效与续航。文章提供了从参数解读、实战测试到深度调优的完整指南,帮助开发者解决电机过热、推力不足等常见问题,实现无人机性能最大化。

weixin_29305313的博客 235

设计模式14 - 命令模式 Command Pattern

Command design pattern is used to encapsulate a request as an object and pass to an invoker, wherein the invoker does not knows how to service the request but uses the encapsulated command to perform

songuo' s home 725

初探802.11协议(0)——PCF/DCF与CSMA/CA机制

IEEE802.11 CSMA/CA机制与DCF机制

FanFF的博客 4505

【设计模式14】命令模式

命令模式是一种将请求封装为对象的设计模式,支持参数化、队列化、撤销和重做操作。它通过将请求(Command)、调用者(Invoker)和接收者(Receiver)解耦,适用于智能家居控制、文本编辑器等需要操作记录和回滚的场景。核心实现包括定义命令接口、具体命令类、接收者设备类,以及支持状态保存和恢复的功能。该模式特别适合处理多样化的设备控制、批量操作执行和事务性需求,能够有效管理复杂的操作流程。

专注后端技术架构,AI技术分享 944

解决Jupyter Notebook中Plotly图表显示问题

摘要:在Jupyter Notebook中使用Plotly绘图时遇到图表无法显示的问题。通过分析发现Python 3.12版本与Jupyter存在兼容性问题。解决方案是将Python降级到3.11版本,重新创建虚拟环境后图表正常显示。这表明版本兼容性对数据可视化工具至关重要,环境配置检查是解决问题的关键步骤。该案例为遇到类似问题的开发者提供了参考方案。

m0_74337424的博客 124

「JS逆向三百例」JS逆向HIKVISION-视频监控的前端密码加密

本文详细分析了HIKVISION-海康威视监控前端登录过程中密码的加密机制,通过逆向工程解析了其 JavaScript 加密逻辑,重点研究了HIKVISION-海康威视监控的前端密码SHA256加密算法的实现。基于逆向分析结果,使用 Python 模拟了HIKVISION-海康威视监控的登录流程,最终实现了自动化登录功能。本文旨在为安全研究人员提供技术参考,帮助理解前端加密机制,并强调技术研究的合法性和合规性。

布啦啦 1095

【Java教程】Day20-14 设计模式:行为型模式——命令模式(Command Pattern)

命令模式(Command Pattern)是一种行为型设计模式,它的核心思想是将请求封装为一个对象,从而使得客户可以通过不同的请求来对调用者进行参数化、排队或记录请求日志,甚至支持撤销操作。在本文中,我们将逐步实现并理解命令模式,探索它的使用场景及优势。

max202011161630的博客 543

8-bit量化在YOLOv11中的部署实践-(使用PTQ、QAT量化技术实现模型体积压缩和推理加速)

本文系统介绍了YOLOv11模型量化技术,主要包括三个核心部分:首先阐述模型量化的基础理论,包括量化分类、数学原理和性能影响;其次分析YOLOv11架构特点及其量化敏感层;最后详细讲解训练后量化(PTQ)的具体实现流程。研究表明,8-bit量化可使YOLOv11模型大小缩减至1/4,推理速度提升1.7-2.3倍,精度损失控制在1%以内。文章特别强调了校准算法选择(如最小最大值法和KL散度法)对量化效果的关键影响,并提供了完整的代码实现示例,为YOLOv11的高效部署提供实用指导。

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1624

设计模式 14 命令模式

命令模式的核心思想是将“请求”封装为对象,并将请求的执行和请求的具体操作细节解耦。这样可以在不同的时间点、不同的环境下执行请求,还可以通过命令对象的统一接口来记录日志、撤销操作等。命令模式通过将操作封装为独立的命令对象,实现了请求发送者与接收者的解耦。它为系统增加了灵活性,尤其是在支持撤销、恢复、宏命令和请求排队等功能时非常有用。然而,命令模式的使用也可能导致类的数量增加,系统的复杂性增加,因此在设计时需要权衡使用。

Winemonk 970

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

23种设计模式(14)_行为型_命令模式(Command Pattern)

定义:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。命令模式的封装性很好:每个命令都被封装起来,对于客户端来说,需要什么功能就去调用相应的命令,而无需知道命令具体是怎么执行的。比如有一组文件操作的命令:新建文件、复制文件、删除文件。如果把这三个操作都封装成一个命令类,客户端只需要知道有这三个命令类即可,至于命令类中封装好的逻辑,客户端则无需知道。其次,命令模式的扩展性很好,在命令模式中,在接收者类中一般会对操作进行最基本的封装,命令

heyuchang666的专栏 824

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

设计模式14 - 命令模式

作者:billy 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 命令模式 使用场景 优缺点 注意事项 UML结构图 代码实现 ...

billy的博客 327

Python设计模式详解之14 —— 命令模式

命令模式(Command Pattern) 是一种行为型设计模式,它将请求封装为对象,从而使您可以用不同的请求、队列或日志来参数化其他对象。命令模式还支持撤销操作。 在 Python 中,命令模式通常用来解耦命令的发送者(调用者)和接收者(执行者),使得命令的调用者不需要知道命令是如何执行的。

拾工 992

设计模式(14)——命令模式

目录命令模式命令模式解决智能生活项目命令模式在Spring框架Jdbc Template应用的源码分析命令模式的注意事项和细节 智能生活项目需求 我们买了一套智能家电,有照明灯、风扇、冰箱、洗衣机,我们只要在手机上安装APP就可以控制对这些家电工作。 这些智能家电来自不同的厂家,我们不想针对每一种家电都安装一个APP,分别控制,我们希望只要一个APP就可以控制全部智能家电。 要实现一个APP...

minge0001的博客 292

经典的设计模式14——命令模式

调用者/请求者(invoker)角色:要求命令对象执行请求,通常会持有命令对象,可以持有很对的命令对象。这个是客户端真正触发命令并且要求要执行的相应操作的地方,相当于使用命令对象的接口。定义:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开,这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储、传递、调用、增加与管理。实现者/接收者角色(receiver):接收者,真正执行命令的对象,任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。,实现命令的撤销与恢复。

weixin_63967970的博客 1168

14、设计模式之命令模式(Command)

设计模式之命令模式(Command)

weixin_45817985的博客 1671

设计模式——命令模式14

命令模式

qq_45178641的博客 514

【设计模式】(14)命令模式

通过本教程,你可以掌握命令模式在解耦请求与操作、支持撤销/重做中的核心技巧,并能够灵活应用于实际开发场景。,从而允许用户使用不同的请求参数化其他对象,并支持请求的排队、记录、撤销和重做操作。,支持批量执行多个命令(如“一键关闭所有家电”),并实现宏命令的撤销。在分布式系统中,如何扩展命令模式以实现分布式事务的补偿(回滚)机制?:解耦请求发送者与接收者,提高系统灵活性和可扩展性。实现文本编辑操作(插入、删除)的撤销功能。通过命令模式控制灯光和风扇的开关。,支持加减操作的执行和撤销。

因为热爱,所以付出 1024

14、设计模式之命令模式

定义 将一个请求封装为一个对象,是发出请求的责任和执行请求的责任分开。这样两者之间通过命令对象进行沟通,这样方便将命令对象就行存储、传递、调用、增加与管理。 结构 命令模式主要包含以下主要角色: 抽象命令类(Command):定义命令的接口,声明执行的方法。 具体命令类(Concrete Command):具体的命令,实现命令接口;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。 接收者/实现者(Receiver):执行命令的对象。 请求者/调用者(Invoker):要求命令对象执行请求,通常

pp_hu的博客 130

设计模式(14)-命令模式

命令模式(Command Pattern):将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式是一种对象行为型模式,其别名为动作(Action)模式或事务(Transaction)模式。

潘威威的博客 2170

python设计模式14-命令模式

1. 命令模式(Command)介绍 UML类图 角色介绍 Command类:是一个抽象类,类中对需要执行的命令进行声明,一般来说要对外公布一个execute方法用来执行命令。 ConcreteCommand类:Command类的实现类,对抽象类中声明的方法进行实现。 Client类:最终的客户端调用类。 Invoker类:调用者,负责调用命令。 Receiver类:接收者,负责接收命令并且执行命令。 2. 示例 顾名思义,命令模式就是对命令的封装。所谓对命令的封装,说白了,无非就是把一系列的操作

rayylee 447

Java设计模式[14]-命令模式

基本介绍 命令模式(Command Pattern):在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计。 命名模式使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活,实现解耦。 在命名模式中,会将一个请求封装为一个对象,以便使用不同参数来表示不同的请求(即命名),同时命令模式也支持可撤销的操作。 通俗易懂的理解:将军发布命令,士兵去执行。其中有

JensenPWLee的博客 129
上一篇: 设计模式-13模板模式
下一篇: 设计模式-15访问者模式
胖柯G
博客等级 码龄10年 453粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值