【设计模式】—-(14)命令模式(行为型)

Java设计模式行为型模式(14)--- 命令模式 日常生活中,我们出去吃饭都会遇到下面的场景。将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行存储、传递、调用、增加与管理。 阅读详情

意图:将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化;对请求排队或记录日志,以及支持可撤销的操作
动机:将”发出请求的对象”和”接收与执行这些请求的对象”分隔开来。
效果:
1)、command模式将调用操作的对象和实现该操作的对象解耦
2)、可以将多个命令装配成一个复合命令,复合命令是Composite模式的一个实例
3)、增加新的command很容易,无需改变已有的类
适用性:
1)、抽象出待执行的动作以参数化某对象
2)、在不同的时刻指定、排列和执行请求。如请求队列
3)、支持取消操作
4)、支持修改日志
5)、用构建在原语操作上的高层操作构造一个系统。支持事物
参与者:
1)、Command
  声明执行操作的接口
2)、ConcreteCommand
  将一个接收者对象绑定于一个动作
  调用接收者相应的操作,以实现execute
3)、Client
  创建一个具体命令对象并设定它的接收者
4)、Invoker
  要求该命令执行这个请求
5)、Receiver
  知道如何实施与执行一个请求相关的操作。任何类都可能作为一个接收者
结构图:

协作:
1)、client创建一个ConcreteCommand对象并指定它的Receiver对象
2)、某Invoker对象存储该ConcreteCommand对象
3)、该Invoker通过调用Command对象的execute操作来提交一个请求。若该命令是可撤销的,ConcreteCommand在执行execute操作前存储当前状态以用于取消该命令
4)、ConcreteCommand对象调用它的Receiver的操作以执行该请求
命令对象将动作和接受者包进对象中,这个对象只暴露出一个execute()方法,当此方法被调用的时候,接收者就会进行这些动作。从外面来看,其他对象不知道究竟哪个接收者进行了哪些动作,只知道如果调用execute()方法,请求的目的就能达到。 

实例:

复制代码
 1 package com.test.patten.command;
 2 
 3 /**
 4  * 命令接口
 5  */
 6 public interface Command {
 7     /**
 8      * 执行命令
 9      */
10     public void execute();
11     /**
12      * 撤销命令
13      */
14     public void undo();
15 }
复制代码
复制代码
 1 package com.test.patten.command;
 2 
 3 /**
 4  * 命令
 5  */
 6 public class CreateCommand implements Command{
 7     private Receiver receiver;
 8     private String state;
 9     
10     public CreateCommand(Receiver receiver){
11         this.receiver = receiver;
12     }
13 
14     @Override
15     public void execute() {
16         receiver.action();
17     }
18 
19     @Override
20     public void undo() {
21         receiver.unAction();
22     }
23     
24 }
复制代码
复制代码
 1 package com.test.patten.command;
 2 
 3 /**
 4  * 命令接收者,命令真正执行人
 5  */
 6 public class Receiver {
 7     public void action(){
 8         System.out.println("执行命令...");
 9     }
10     
11     public void unAction(){
12         System.out.println("撤销命令...");
13     }
14 }
复制代码
复制代码
 1 package com.test.patten.command;
 2 
 3 public class Invoker {
 4     /**
 5      * 调用者持有命令对象
 6      */
 7     private Command command;
 8 
 9     /**
10      * 设置命令对象
11      * @param command
12      */
13     public void setCommand(Command command) {
14         this.command = command;
15     }
16     public Command getCommand() {
17         return command;
18     }
19 
20     /**
21      * 执行命令
22      */
23     public void runCommand(){
24         command.execute();
25     }
26     /**
27      * 撤销命令
28      */
29     public void unDoCommand(){
30         command.undo();
31     }
32 }
复制代码
复制代码
 1 package com.test.patten.command;
 2 
 3 public class Client {
 4     public static void main(String[] args){
 5         //创建接受者
 6         Receiver receiver = new Receiver();
 7         //创建命令对象,并设置它的接受者
 8         Command command = new CreateCommand(receiver);
 9         
10         //创建调用者,将命令对象设置进去
11         Invoker invoker = new Invoker();
12         invoker.setCommand(command);
13         
14         //这里可以测试一下
15         invoker.runCommand();
16         invoker.unDoCommand();
17     }
18 }
复制代码

常见应用:
1、工作队列,线程池,日程安排
2、日志请求(系统恢复)
要点:
1、命令模式将发出请求的对象和执行请求的对象解耦
2、在被解耦的两者之间是通过命令对象进行沟通的。命令对象封装了接收者和一个或一组动作
3、调用者通过调用命令对象的execute()发出请求,这会使得接收者的动作被调用
4、调用者可以接受命令当作参数,甚至在运行时动态的进行
5、命令可以支持撤销,做法是实现一个undo()方法来回到execute()被执行前的状态
6、宏命令是命令的一种简单的延伸,允许调用多个命令。宏方法也可以支持撤销
7、实际操作时,很常见使用"聪明"命令对象,也就是直接实现了请求,而不是将工作委托给接受者(弊端?)
8、命令也可以用来实现日志和事物系统




命令模式属于对象的行为模式。命令模式又称为行动(Action)模式或交易(Transaction)模式。

  命令模式把一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。

命令模式的结构

  命令模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。

  每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行操作。命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否被执行、何时被执行,以及是怎么被执行的。

  命令允许请求的一方和接收请求的一方能够独立演化,从而具有以下的优点:

  (1)命令模式使新的命令很容易地被加入到系统里。

  (2)允许接收请求的一方决定是否要否决请求。

  (3)能较容易地设计一个命令队列。

  (4)可以容易地实现对请求的撤销和恢复。

  (5)在需要的情况下,可以较容易地将命令记入日志。

 

命令模式的优点

  ●  更松散的耦合

  命令模式使得发起命令的对象——客户端,和具体实现命令的对象——接收者对象完全解耦,也就是说发起命令的对象完全不知道具体实现对象是谁,也不知道如何实现。

  ●  更动态的控制

  命令模式把请求封装起来,可以动态地对它进行参数化、队列化和日志化等操作,从而使得系统更灵活。

  ●  很自然的复合命令

  命令模式中的命令对象能够很容易地组合成复合命令,也就是宏命令,从而使系统操作更简单,功能更强大。

  ●  更好的扩展性

  由于发起命令的对象和具体的实现完全解耦,因此扩展新的命令就很容易,只需要实现新的命令对象,然后在装配的时候,把具体的实现对象设置到命令对象中,然后就可以使用这个命令对象,已有的实现完全不用变化。

Palabos User Guide中文解读 | 第一章 | 介绍 译者的话:本人在学习palabos时,发现国内中文资料甚少,恰好网上可以直接搜到palabos user guide这种英文资料,加之时间充裕,便打算开始翻译,能不能完成全本翻译再说,而且文中我也会标记我不确定的地方,以传达意思为主,翻译不当的地方还请各位读者帮忙指正。 Palabos User Guide Release 1.0 r1 Copyright © 2019 University of... 阅读详情

相关推荐

快速入门:使用 SQL Server Management Studio (SSMS) 连接和查询 SQL Server 实例

开始使用 SQL Server Management Studio (SSMS) 连接到 SQL Server 实例并运行一些 Transact-SQL (T-SQL) 命令。本文介绍如何连接和查询实例SQL Server。有关 Azure SQL,请参阅连接。若要使用,请参阅连接和查询。若要详细了解如何SQL Server Management Studio,请参阅其他。......

m0_72938729的博客 5729

根据参数值的不同,调用不同实现类

最近的业务跟口碑关联比较紧密,为了支持客户定制化的要求,有些内容留了扩展口,口碑的团队同学帮我们定义了一些模板类,然后通过实现类传入不同的参数实现不同的功能。其底层的实现源码没有看过,但是类似的功能在dubbo里面也有很多。实际上也是一种钩子方法。 出于兴趣,自己根据需求实现了个简单的功能: 传入"cat"实现猫叫, 传入"dog"实现狗叫。在此贴一下源码: 1、先创建一个抽象的模板类,子类通过实现抽象的方法,并且子类对象调用doSpeak方法,即可实现子类的不同功能。实现类的命名要求必须是传入参数名

sdmanooo的专栏 5823

RV1106G3的fastboot调试

本文详细描述了在幸狐的Luckfox Pico Ultra硬件平台上,使用官方SDK进行系统优化和YOLOv5s模型部署的过程。首先,硬件板卡使用幸狐的SDK进行EMMC非Fastboot配置时功能正常,但Fastboot配置编译失败,通过修改设备树中的ramdisk大小解决了编译问题,但运行时仍报错。幸狐提供的Fastboot烧录文件可正常运行,表明硬件支持Fastboot。随后,使用官方SDK版本rv1106_rv1103_240813进行编译和调试,发现EMMC Fastboot启动失败,通过修改U-

fzktongyong的博客 2360

设计模式之策略模式【内附通过工厂方法+枚举实现根据参数调用不同的策略】

设计模式之策略模式【内附通过工厂方法+枚举实现根据参数调用不同的策略】

Ouyzc的博客 3908

篮球比赛24秒计时器改造指南:用Multisim实现可调式倒计时系统

本文详细介绍了如何使用Multisim软件改造篮球比赛24秒计时器,实现可调式倒计时系统。从脉冲信号发生器到声光报警模块,提供了完整的电路设计方案和调试技巧,帮助开发者快速掌握数字电路设计的核心原理,提升体育电子设备开发效率。

wood5的博客 211

Spring Authorization Server自定义密码模式:突破标准OAuth2限制,实现MFA与复杂业务集成

OAuth 2.0授权框架是构建现代应用安全体系的基石,其密码模式(Resource Owner Password Credentials Grant)提供了一种直接的资源所有者凭证交换令牌的机制。该模式的核心原理是客户端收集用户密码并直接向授权服务器请求访问令牌,适用于受信任的客户端场景。在技术价值上,它简化了某些传统应用的OAuth集成流程。然而,标准实现往往难以满足复杂的现实业务需求,例如需要集成多因素认证(MFA)、对接外部LDAP目录服务或执行自定义密码加密校验等场景。Spring Authori

weixin_34302561的博客 437

行为型模式——命令模式

模式定义 命令模式(Command Pattern):将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。命令模式是一种对象行为型模式,其别名为动作(Action)模式或事务(Transaction)模式。 模式结构 命令模式包含如下角色: Command: 抽象命令类 ConcreteCommand: 具体命令类 Invoke...

weixin_44738940的博客 335

嵌入式SPI总线抽象设计:跨平台驱动与分层解耦实践

SPI(串行外设接口)是嵌入式系统中应用最广泛的同步串行通信协议,其核心价值在于高吞吐、低开销与硬件简洁性。其工作原理基于主从架构、全双工/半双工时序及片选(CS)控制,依赖CPOL/CPHA组合定义四种标准模式。在工程实践中,SPI常面临硬件资源受限、多外设共用总线、MCU平台迁移等挑战,导致驱动复用率低、维护成本高。通过结构体+函数指针实现的分层抽象——将物理总线、协议适配与设备驱动解耦,可显著提升代码可移植性与扩展性。该方法天然支持硬件SPI与GPIO模拟SPI双模式切换,并已在STM32等主流MCU

weixin_42601134的博客 60

设计模式--Command--行为型

耦合与变化耦合是软件不能抵御变化灾难的根本性原因。不仅实体对象与实体对象之间存在耦合关系,实体对象与行为操作之间也存在耦合关系。 动机(Motivation)在软件构建过程中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合——比如需要对行为进行“记录、撤销/重做(undo/redo)、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者

The Tech-Dragon 1084

【农业生产系统模型】基于R语言APSIM模型进阶应用与参数优化、批量模拟实践技术

APSIM模型有Classic和Next Generation两个系列模型,能模拟几十种农作物、牧草和树木的土壤-植物-大气过程,被广泛应用于精细农业、水肥管理、气候变化、粮食安全、土壤碳周转、环境影响、农业可持续性、农业生态等诸多与农业生产和科研有关的领域。R语言是一门应用场景广泛、简单易学的程序语言,APSIM模型开发了许多R语言辅助包,在APSIM模型的气候、土壤、管理措施等数据准备,自动化模拟,参数优化和结果分析上都发挥着重要的作用。案例一:APSIM模型输入参数和土壤文件的制备。

2303_79243743的博客 1046

告别反复刷写:用英飞凌XCP Overlay功能实现ECU标定与诊断的‘热更新’

本文详细介绍了英飞凌XCP Overlay功能在ECU标定与诊断中的应用,实现参数的'热更新',避免反复刷写Flash。通过地址重映射技术,将标定变量从Flash重定向到RAM,显著提升工作效率并保护Flash寿命。文章涵盖技术原理、工程实践、功能安全考量及高级应用场景,为汽车电子工程师提供完整解决方案。

weixin_30689307的博客 528

第16章 行为型模式—命令模式

1. 命令模式(Command Pattern)的定义 (1)定义   将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。   ①封装请求:抽象出需要执行的动作,封装成对象(有统一的接口)。   ②参数化:可以用不同的命令对象,去参数化配置客户的请求。(即,将命令对象作为参数去供Invoker调用)。 (2)命令模式的结构和...

CherishPrecious的博客 485

【ROS学习笔记】8.话题消息(Message)的定义与使用

ROS学习笔记8——话题消息(Message)的定义与使用

takedachia的博客 9548

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

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

星Yeah 的博客 2559

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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

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

max202011161630的博客 543

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

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

heyuchang666的专栏 824

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

14行为型设计模式——命令模式

命令模式(Command Pattern)是一种行为型设计模式,它将请求封装成一个对象,从而使你可以用不同的请求对客户端进行参数化,支持请求的排队和日志记录,以及支持可撤销的操作。命令模式是最常见的方式之一。例如前面几十个设计模式提供的设计方法中a.out本身就是一个命令(可执行程序),当我们去执行a.out可以产生不同的行为或状态。命令模式是一个十分实用的行为型设计模式,将复杂的内部实现(请求)全部封装,对外显示一个命令形态,对客户端来说十分友好。

qq_55610255的博客 218

【从零入门23种设计模式14】行为型之命令模式

命令模式是一种行为型设计模式,它将请求封装为独立对象,实现调用者与接收者的解耦。核心角色包括抽象命令、具体命令、接收者和调用者。模式优势在于支持请求参数化、队列化、撤销和日志记录等功能。本文通过智能家居遥控案例演示基础实现,并给出Spring企业级应用示例(订单生命周期管理),展示如何结合事务、批量执行等生产需求。模式适用于需要撤销/重做、异步执行或解耦调用关系的场景,但可能增加代码复杂度。与策略模式不同,命令模式侧重操作封装而非算法选择。

2401_87662859的博客 546

【设计模式(14)】行为型模式之命令模式

个人学习笔记分享,当前能力有限,请勿贬低,菜鸟互学,大佬绕道 如有勘误,欢迎指出和讨论,本文后期也会进行修正和补充 前言 生活中,一件事情的请求者和执行者不一定是同一个人。比如我们申请售后的时候,将需要的信息等告知售后,然后由售后来安排处理,我们可以去做别的事情了;电视遥控器向电视发送命令,电视来执行;老板给我们分配任务等等。。。 好处是我们不需要将请求者与执行者建立绑定关系,也不需要占用请求者的时间。 在开发中,我们也会需要解除请求者和执行者之间的耦合,一方面利于扩展,一方面使得两者不必同步运作。 .

路远不知归 243

JAVA SCRIPT设计模式--行为型--设计模式之Command命令模式(14)

用Command对象可很容易的实现菜单(Menu),每一菜单中的选项都是一个菜单项(MenuItem)类的实例。当用户选择了一个菜单项时,该MenuItem对象调用它的Command对象的Execute方法,而Execute执行相应操作。但工具箱 不能显式的在按钮或菜单中实现该请求,因为只有使用工具箱的应用知道该由哪个对象做哪 个操作。而工具箱的设计者无法知道请求的接受者或执行的操作。这一模式的关键是一个抽象的Command类,它定义了一个执行操作的接口。其最简单的形式是一个抽象的Execute操作。

火柴盒 391

设计模式(14)--Command(命令模式)--行为型

作者QQ:1095737364    QQ群:123300273     欢迎加入! 1.模式定义:     命令模式属于对象的行为模式。命令模式又称为行动(Action)模式或交易(Transaction)模式。     命令模式把一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。 2.模式特点:

buyaoxx的博客 378

设计模式14---设计模式之命令模式(Command)(行为型)

1.场景模拟 请用软件模拟开机过程 按下启动按钮 然后电源供电 主板开始加电自检 BIOS依次寻找其他设备的BIOS并且让他们初始化自检 开始检测CPU,内存,光盘,硬盘,光驱,串口,并口,软驱即插即用设备 进入系统引导 上面的过程可以抽象为如下: 客户端只是想要发出命令或者请求,不关心请求的真正接受者是谁,也不关心具体如何实现,而且...

weixin_30267691的博客 90

设计模式(14)-行为型-命令模式(Command)

概述将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。适用性抽象出待执行的动作以参数化某对象,你可用过程语言中的回调(c a l l b a c k )函数表达这种参数化机制。所谓回调函数是指函数先在某处注册,而它将在稍后某个需要的时候被调用。C o m m a n d 模式是回调机制的一个面向对象的替代品。 在不同的时刻指定、排列和

iihero@优快云 2267

设计模式14:Command 命令模式(行为型模式)

Command 命令模式(行为型模式) 耦合与变化 耦合是软件不能抵御变化的根本性原因。不仅实体对象与实体对象之间存在耦合关系,实体对象与行为操作之间也存在耦合关系。 动机(Motivation) 在软件构建过程中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合——比如对行为进行“记录、撤销/重做(undo/redo)、事务”等处理,这种无法抵御变化的紧耦合是不合适的。...

weixin_30731287的博客 95

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

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

在未来等你的专栏 747
上一篇: 【设计模式】—-(13)模板方法模式(行为型)
下一篇: 【设计模式】—-(15)迭代器模式(行为型)
白衣染霜陈
博客等级 码龄22年 682粉丝 338原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值