java设计模式——命令模式(Command Pattern)

宏命令——实现命令的批处理 宏命令 题目 宏命令又称组合命令,它包含了对其他命令对象的引用。宏命令包含了一组命令,它充当了具体命令与调用者的双重角色,执行它时将递归调用它所包含的所有命令,从而实现命令的批处理。以下给出了一种宏命令的类图,根据类图编码实现宏命令。 类图 界面 相关代码 ... 阅读详情
概述:
       在软件开发中,我们经常需要向某些对象发送请求(调用其中的某个或某些方法),但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,此时,我们特别希望能够以一种松耦合的方式来设计软件,使得请求发送者与请求接收者能够消除彼此之间的耦合,让对象之间的调用关系更加灵活,可以灵活地指定请求接收者以及被请求的操作。命令模式为此类问题提供了一个较为完美的解决方案。
       命令模式可以将请求发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。

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

结构:
  • Command(抽象命令类):抽象命令类一般是一个抽象类或接口,在其中声明了用于执行请求的execute()等方法,通过这些方法可以调用请求接收者的相关操作。
  • ConcreteCommand(具体命令类):具体命令类是抽象命令类的子类,实现了在抽象命令类中声明的方法,它对应具体的接收者对象,将接收者对象的动作绑定其中。在实现execute()方法时,将调用接收者对象的相关操作(Action)。
  • Invoker(调用者):调用者即请求发送者,它通过命令对象来执行请求。一个调用者并不需要在设计时确定其接收者,因此它只与抽象命令类之间存在关联关系。在程序运行时可以将一个具体命令对象注入其中,再调用具体命令对象的execute()方法,从而实现间接调用请求接收者的相关操作。
  • Receiver(接收者):接收者执行与请求相关的操作,它具体实现对请求的业务处理。

UML图:


场景:公司项目开发过程中,客户有需求,直接通过项目经理来传递,比如客户要改需求,无论改画面或者改流程也好,直接跟项目经理沟通,然后项目经理根据情况找到公司相关负责人进行任务分配,关于界面的会让UI组去完成,关于业务流程的让开发组完成,客户只需要最终结果就行了。

代码分析:
/**
 * Created by **
 * 定义一个调用者:项目经理
 */
public class Invoker {
    private Command command;

    /**
     * 接到客户具体命令
     * @param command
     */
    public void setCommand(Command command){
        this.command = command;
    }

    /**
     * 执行命令
     */
    public void call(){
        this.command.execute();
    }
}

/**
 * Created by **
 * 定义命令抽象类
 */
public abstract class Command {
    // 需要执行的命令
    protected abstract void execute();
}

/**
 * Created by **
 * 抽象接收者:负责执行具体的任务
 */
public abstract class ReceivceGroup {
    protected abstract void add();
    protected abstract void modify();
    protected abstract void delete();
}

/**
 * Created by **
 * 具体接收者
 */
public class RequirementGroup extends ReceivceGroup {

    @Override
    protected void add() {
        LogFactory.log("增加一个需求");
    }

    @Override
    protected void delete() {
        LogFactory.log("删除一个需求");
    }

    @Override
    protected void modify() {
        LogFactory.log("修改需求计划");
    }
}

/**
 * Created by **
 * 具体的命令
 */
public class AddRequirementCommand extends Command {
    private RequirementGroup requirementGroup = new RequirementGroup();
    @Override
    protected void execute() {
        this.requirementGroup.delete();
        this.requirementGroup.add();
        this.requirementGroup.modify();
    }
}
客户端:
// 找到项目经理
Invoker invoker = new Invoker();
// 客户下达具体命令
AddRequirementCommand addRequirementCommand = new AddRequirementCommand();
// 经理收到这个命令
invoker.setCommand(addRequirementCommand);
// 执行命令
invoker.call();
log输出:
08-12 17:11:59.056 22236-22236/? D/yangjun: 删除一个需求
08-12 17:11:59.056 22236-22236/? D/yangjun: 增加一个需求
08-12 17:11:59.056 22236-22236/? D/yangjun: 修改需求计划

优点:
  • 降低系统的耦合度。
  • 新的命令可以很容易地加入到系统中。
  • 可以比较容易地设计一个命令队列和宏命令(组合命令)。
  • 可以方便地实现对请求的Undo和Redo。

缺点:
  • 使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个命令都需要设计一个具体命令类,因此某些系统可能需要大量具体命令类,这将影响命令模式的使用。

适用环境:
  • 系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。
  • 系统需要在不同的时间指定请求、将请求排队和执行请求。 一个命令对象和请求的初始调用者可以有不同的生命期,换言之,最初的请求发出者可能已经不在了,而命令对象本身仍然是活动的,可以通过该命令对象去调用请求接收者,而无须关心请求调用者的存在性,可以通过请求日志文件等机制来具体实现。
  • 系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作。
  • 系统需要将一组操作组合在一起,即支持宏命令

扩展:
宏命令又称为组合命令,它是命令模式和组合模式联用的产物。
  • 宏命令也是一个具体命令,不过它包含了对其他命令对象的引用,在调用宏命令的execute()方法时,将递归调用它所包含的每个成员命令的execute()方法,
  • 一个宏命令的成员对象可以是简单命令,还可以继续是宏命令。执行一个宏命令将执行多个具体命令,从而实现对命令的批处理。


Java设计模式之命令模式(Command Pattern) 命令模式通过将操作封装为对象,实现了请求发送者与接收者的解耦,适用于需要支持撤销、事务、批量操作等复杂场景。,它将请求封装为独立的对象,使得不同请求的调用、队列化、日志记录或撤销操作成为可能。该模式通过解耦请求的发送者与接收者,增强系统的灵活性和扩展性。:将请求转换为包含所有请求信息的独立对象(命令),支持参数化、延迟执行、撤销/重做等功能。:按钮点击事件绑定命令对象,支持撤销(如Photoshop的“撤销上一步”)。:数据库事务的提交与回滚可视为命令模式的应用。支持命令的队列、日志、撤销/重做。 阅读详情

相关推荐

【Java设计模式】Java设计模式之(六)命令模式(Command Pattern)

本文目录 一、命令模式介绍 二、代码实现 2.1 通用类图 2.2 代码实现 命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。 一、命令模式介绍 意图:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。 主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤

No8g攻城狮的博客 794

设计模式(二十)—命令模式(行为型)

一、简介(Brief Introduction)       在软件系统中,“行为请求者”与“行为实现者”通常呈现一种“紧耦合”。但在某些场合,比如要对行为进行“记录、撤销/重做、事务”等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将“行为请求者”与“行为实现者”解耦?将一组行为抽象为对象,实现二者之间的松耦合。这就是命令模式(Command Pattern)  例子1:电视机

遇见更好的自己 1038

AI大模型驱动Web UI自动化测试:Playwright与RobotFramework智能整合实践

Web自动化测试是软件质量保障的关键环节,其核心原理是通过脚本模拟用户操作,对Web应用界面进行功能验证。传统方法依赖固定的元素定位和脚本逻辑,在应对频繁的UI变更时面临维护成本高、脚本脆弱的挑战。随着AI大模型技术的发展,其强大的自然语言理解和代码生成能力为自动化测试带来了新的技术价值。通过将大模型的意图理解与代码生成能力,与Playwright强大的浏览器自动化执行引擎以及RobotFramework灵活的关键字驱动框架相结合,可以构建出能够理解自然语言指令、动态生成稳定操作脚本的智能测试系统。这种融合

weixin_28718769的博客 410

java ee图书管理系统_基于jsp的图书馆管理系统-JavaEE实现图书馆管理系统 - java项目源码...

基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的图书馆管理系统, 该项目可用各类java课程设计大作业中, 图书馆管理系统的系统架构分为前后台两部分, 最终实现在线上进行图书馆管理系统各项功能,实现了诸如用户管理, 登录注册, 权限管理等功能, 并实现对各类图书馆管理系统相关的实体进行管理。该图书馆管理系统为一个采用mvc设计模式进行开发B/S架构项目,并采用...

weixin_39629467的博客 1859

海康线扫相机平场矫正教程

1、白纸准备确保视野中有一张平整且无折痕的白纸,使其完全铺满相机的整个视野。2、行高设置将行高参数设定为 2048。3、灰度值控制相机端图像的灰度值应维持在 120 - 160 这个区间内。同时,最亮像素点与最暗像素点的灰度值差值不得超过 4 倍。在调整灰度值时,尽量开启增益功能。4、 图像模糊处理为减少白纸对平场矫正的影响,需将相机端获取的图像进行模糊化处理。具体操作是对镜头进行虚焦,使整体图像变得模糊。

T 2743

MacOS上如何修改jupyter book的默认打开地址以及如何复制文件路径

记点笔记,才换新系统小半年,还是不太熟悉,所以记录一下笔记,感觉之后也会用到,希望能帮到你们。主要内容是:修改jupyter的默认地址以及复制文件路径。

魔仙的博客 1978

设计模式 图书

xuxue_liu的专栏 520

STM32 HAL库定时器中断里读编码器速度准吗?聊聊MG310电机的测速与防溢出处理

本文探讨了STM32 HAL库在定时器中断中读取编码器速度的精度问题,特别针对MG310电机的测速与防溢出处理提供了解决方案。通过对比定时中断法和编码器模式的性能,揭示了硬件编码器接口在降低误差和CPU占用率方面的优势,并详细介绍了CubeMX配置技巧和防溢出处理的工程实践。

weixin_28720767的博客 400

命令模式(Command Pattern)

模式动机: 1、在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活。 2、命令模式可以对发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而...

weixin_33849942的博客 177

advanced installer 打包Flutter的Windows程序安装包(基本打包、开机自启、定时自动检测升级、包含卸载程序)

advanced installer 打包Flutter的Windows程序安装包(基本打包、开机自启、定时自动检测升级、包含卸载程序)

qq_45634989的博客 2878

TC8:IPv4_HEADER_05-09

所有主机都必须准备好接受最多576个字节的数据报我们知道最大传输单元MTU通常是1500个字节,也就是说一条IP数据报的Header+payload最大1500,那为什么这条测试用例又要求主机准备好接受最多576个字节的IP数据报呢。

jasonj333 510

Java设计模式 Design Pattern:命令模式 Command Pattern

Java设计模式 Design Pattern:命令模式 Command Pattern 目的 Encapsulate a request as an object, thereby letting you parameterize clients with different requests, queue or log requests, and support un...

ahch8077的博客 163

C#实现OPC客户端与S7-1200 PLC通信:工控场景稳定通信的实战指南(附完整代码)

标准化优先:OPC UA是工业通信的标准,相比直接通信,更适合多设备集成的工控场景;稳定性第一:必须封装断线重连、异常处理、资源释放逻辑,满足7×24小时运行需求;效率优化:高频采集场景优先用批量读写,避免单个变量频繁请求;细节把控:节点ID、变量类型、端口配置等细节是新手最容易踩坑的地方,建议先用UA Expert验证。这套代码和方案已在多个工业项目中落地,从单台S7-1200到多台S7-1200/1500集群,都能稳定运行。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1033

Java设计模式——命令模式【Command Pattern】

Java设计模式、命令模式、Command Pattern

scorpio的博客 1038

OpenGL ES 3.0 开发(一):绘制一个三角形

该原创文章首发于微信公众号:字节流动 什么是 OpenGLES OpenGLES 全称 OpenGL for Embedded Systems ,是三维图形应用程序接口 OpenGL 的子集,本质上是一个跨编程语言、跨平台的编程接口规范,主要应用于嵌入式设备,如手机、平板等。由科纳斯(Khronos)组织定义和推广,科纳斯是一个图形软硬件行业协会,该协会主要关注图形和多媒体方面的开放标准。 O...

字节流动 8万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

JAVA设计模式之 命令模式【Command Pattern】

一、概述     命令模式可以将请求发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。核心在于引入了命令类,通过命令类来降低发送者和接收者的耦合度,请求发送者只需指定一个命令对象,再通过命令对象来调用请求接收者的处理方法,命令模式是一种对象行为型模式。 二、使用场景 1>、系统要求请求发送者和接收者的解耦

小吕丶Code阶区 2591

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

java设计模式--命令模式(Command Pattern)

Java之命令模式(Command Pattern) 1.概念   将来自客户端的请求传入一个对象,从而使你可用不同的请求对客户进行参数化。用于“行为请求者”与“行为实现者”解耦,可实现二者之间的松耦合,以便适应变化。分离变化与不变的因素。    在面向对象的程序设计中,一个对象调用另一个对象,一般情况下的调用过程是:创建目标对象实例;设置调用参数;调用目标对象的方法。 但在有些情况...

白开水的世界 210

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Java设计模式——命令模式(Command Pattern)

命令模式将一个请求封装为一个对象,从而使你可用不同的请求把客户端参数化;对请求排队或记录请求日志,以及支持可撤销的操作。这种模式允许你将发出请求的责任和执行请求的责任分割开。

weixin_43841461的博客 1323

Java设计模式 十七 命令模式 (Command Pattern)

命令模式通过将请求封装成对象,解耦了请求的发送者和接收者,提供了灵活的执行、撤销和组合命令的能力。它在需要解耦请求和执行的场景中非常有用,尤其适用于GUI系统、任务调度、宏命令等应用场景。虽然命令模式可能增加系统的复杂度,但它在结构上更具可扩展性和灵活性,非常适合处理复杂的操作逻辑。

空 747

Java 设计模式-命令模式(Command Pattern)

命令模式(Command Pattern)是对象的行为模式,其意图是将请求封装在对象的内部。 命令模式涉及的角色有: 客户端(Client )角色:负责创建一个具体的命令,并指定命令的接受者 命令(Command)角色:定义一个命令公共的操作接口 具体命令(Concrete Command)角色:定义一个命令的接收者和行为之间的耦合。实现命令接口的公共接口,调用接......

技术分享 261

Java设计模式-命令模式(Command Pattern)

命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,最终把命令给执行掉。

IT熊的专栏 420

设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 命令模式(Command) - Java实现

设计模式(Design Pattern) - 行为型模式(Behavioral Pattern) - 命令模式(Command) 目的:达到命令的发出者和执行者之间解耦,实现请求和执行分开。一、说明: 1、Command 命令(接口); 2、Receiver 命令接收者; 3、MyCommand 命令.实现类; 4、Invoker 命令发送者。二、Java实现,代码如下: 1、Comm

Z 392

【Java设计模式】· 命令模式(Command Pattern)

1.命令模式:按自己的理解,命令模式的优点在于封装性完好,user在使用命令模式时候只需要知道“功能”而不需了解其他,而命令模式的重点在于,把所有的命令事先写好在一个类(ControlPanel)中,这样所有的操作都仅对这个(ControlPanel)类执行。 2.例子:简单地模拟控制一间房间的灯的开关。

早起早睡的少年郎 607

设计模式之命令模式Command Pattern-Java版

一、定义 The Command Pattern encapsulates a request as an object, thereby letting you parameterize other objects with different requests, queue or log requests, and support undoable operations. 命令模式把请求封装为一个对象,因此,你可以使用不同的请求、队列或日志请求 参数化其他对象,并支持可撤消的操作。 从定义中,可以得知

qianmojl的博客 184
上一篇: java设计模式——备忘录模式(Memento Pattern)
下一篇: java设计模式——中介者模式(Mediator Pattern)
OODeveloper
博客等级 码龄12年 43粉丝 137原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值