GoF设计模式:命令模式(Command Pattern)—请求发送者与接收者解耦


GoF设计模式:命令模式(Command Pattern)—请求发送者与接收者解耦

模式概述

生活中,在购买开关时,我们并不知道它将来到底用于控制什么电器,也就是说,开关与电灯、排气扇并无直接关系,一个开关在安装之后可能用来控制电灯,也可能用来控制排气扇或者其他电器设备。开关与电器之间通过电线建立连接,如果开关打开,则电线通电,电器工作;反之,开关关闭,电线断电,电器停止工作。相同的开关可以通过不同的电线来控制不同的电器,如下图所示:

命令模式(Command Pattern)——请求发送者与接收者解耦

图中,我们可以将开关理解成一个请求的发送者,用户通过它来发送一个“开灯”请求,而电灯是“开灯”请求的最终接收者和处理者,在图中,开关和电灯之间并不存在直接耦合关系,它们通过电线连接在一起,使用不同的电线可以连接不同的请求接收者,只需更换一根电线,相同的发送者(开关)即可对应不同的接收者(电器)。

在软件开发中,我们经常需要向某些对象发送请求(调用其中的某个或某些方法),但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,此时,我们特别希望能够以一种松耦合的方式来设计软件,使得请求发送者与请求接收者能够消除彼此之间的耦合,让对象之间的调用关系更加灵活,可以灵活地指定请求接收者以及被请求的操作。命令模式为此类问题提供了一个较为完美的解决方案。

模式定义

命令模式可以将请求发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。

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

模式结构图

命令模式的核心在于引入了命令类,通过命令类来降低发送者和接收者的耦合度,请求发送者只需指定一个命令对象,再通过命令对象来调用请求接收者的处理方法,其结构如下图所示:

命令模式(Command Pattern)——请求发送者与接收者解耦

模式伪代码

命令模式的关键在于引入了抽象命令类,请求发送者针对抽象命令类编程,只有实现了抽象命令类的具体命令才与请求接收者相关联。在最简单的抽象命令类中只包含了一个抽象的execute()方法,每个具体命令类将一个Receiver类型的对象作为一个实例变量进行存储,从而具体指定一个请求的接收者,不同的具体命令类提供了execute()方法的不同实现,并调用不同接收者的请求处理方法。

/**
 * 抽象命令类
 */
public abstract class Command {
    /**
     * 执行命令
     */
    abstract void execute();

    /**
     * 撤销命令
     */
    abstract void undo();
}


/**
 * 请求接收者
 */
public class Receiver {

    public void executeAction() {
        // 具体执行操作
    }

    public void undoAction() {
        // 具体撤销操作
    }
}


/**
 * 具体的命令
 */
public class ConcreteCommand extends Command {
    // 维持一个对请求接收者对象的引用
    private Receiver receiver;

    @Override
    public void execute() {
        // 接收者的业务操作
        receiver.executeAction();
    }

    @Override
    void undo() {
        // 接收者的撤销操作
        receiver.undoAction();
    }
}

当然你在实际开源项目中看到运用命令模式的代码可能并不是这样的,我见过的大多是抽象出Command类和Executor类。设计模式本来就是一种内功心法,重意不重形,学习设计模式主要是看前辈们是如何进行抽象、解耦,使得软件设计最大程序符合单一职责、开闭等原则。

模式总结

命令模式的本质是对请求进行封装,一个请求对应于一个命令,将发出命令的责任和执行命令的责任分割开。每一个命令都是一个操作:请求的一方发出请求要求执行一个操作;接收的一方收到请求,并执行相应的操作。命令模式允许请求的一方和接收的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求如何被接收、操作是否被执行、何时被执行,以及是怎么被执行的。

命令模式是一种使用频率非常高的设计模式,它可以将请求发送者与接收者解耦,请求发送者通过命令对象来间接引用请求接收者,使得系统具有更好的灵活性和可扩展性。

主要优点

  • 降低系统的耦合度,请求可以独立扩展
  • 为请求的撤销(Undo)和恢复(Redo)操作提供了一种设计和实现方案

主要缺点

使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个对请求接收者的调用操作都需要设计一个具体命令类,因此在某些系统中可能需要提供大量的具体命令类,这将影响命令模式的使用。

适用场景

  • 系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。请求调用者无须知道接收者的存在,也无须知道接收者是谁,接收者也无须关心何时被调用。
  • 系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作。

CSCODE.NET开发框架文库 - C/S架构winform开发框架

版权声明:本文为开发框架文库发布内容,转载请附上原文出处连接
C/S框架网
上一篇:GoF设计模式:访问者模式(Visitor Pattern)—操作复杂对象结构
下一篇:GoF设计模式:职责链模式(Chain of Responsibility Pattern)—请求的链式处理
评论列表

发表评论

评论内容
昵称:
关联文章

GoF设计模式命令模式(Command Pattern)—请求发送者接收者
GoF设计模式:职责链模式(Chain of Responsibility Pattern)—请求的链式处理
GoF设计模式:工厂模式(Factory Pattern)
GoF设计模式:适配器模式(Adapter Pattern)—不兼容结构的协调
GoF设计模式:建造者模式(Builder Pattern)—复杂对象的组装创建
GoF设计模式:桥接模式(Bridge Pattern)—处理多维度变化
GoF设计模式:外观模式(Facade Pattern)—提供统一的入口
GoF设计模式:中介者模式(Mediator Pattern)—协调多个对象之间的交互
GoF设计模式:装饰模式(Decorator Pattern)—扩展系统功能
GoF设计模式:享元模式(Flyweight Pattern)—实现对象的复用
GoF设计模式:代理模式(Proxy Pattern)—对象的间接访问
GoF设计模式:原型模式(Prototype Pattern)—对象的克隆
GoF设计模式:组合模式(Composite Pattern)—树形结构的处理
GoF设计模式:迭代器模式(Iterator Pattern)—遍历聚合对象中的元素
GoF设计模式:单例模式(Singleton Pattern)—确保对象的唯一性
GoF设计模式:访问者模式(Visitor Pattern)—操作复杂对象结构
C/S开发框架提供类似SAP系统的快速命令,能快速打开界面窗体(Command模式
设计模式 - 外观模式应用(Façade Pattern)
开发应用-职责链模式(Chain Of Resposibility Pattern)
开发应用 - 策略模式(Strategy Pattern) 常用设计模式

热门标签
.NET5 .NET6 .NET7 APP Auth-软件授权注册系统 Axios B/S B/S开发框架 Bug Bug记录 C#加密解密 C#源码 C/S CHATGPT CMS系统 CodeGenerator CSFramework.DB CSFramework.EF CSFrameworkV1学习版 CSFrameworkV2标准版 CSFrameworkV3高级版 CSFrameworkV4企业版 CSFrameworkV5旗舰版 CSFrameworkV6.0 DAL数据访问层 Database datalock DbFramework Demo教学 Demo下载 DevExpress教程 DOM EF框架 Element-UI EntityFramework ERP ES6 Excel FastReport GIT HR IDatabase IIS JavaScript LINQ MES MiniFramework MIS NavBarControl Node.JS NPM OMS ORM PaaS POS Promise API Redis SAP SEO SQL SQLConnector TMS系统 Token令牌 VS2022 VSCode VUE WCF WebApi WebApi NETCore WebApi框架 WEB开发框架 Windows服务 Winform 开发框架 Winform 开发平台 WinFramework Workflow工作流 Workflow流程引擎 版本区别 报表 踩坑日记 操作手册 代码生成器 迭代开发记录 基础资料窗体 架构设计 角色权限 开发sce 开发技巧 开发教程 开发框架 开发平台 开发指南 客户案例 快速搭站系统 快速开发平台 秘钥 密钥 权限设计 软件报价 软件测试报告 软件简介 软件开发框架 软件开发平台 软件开发文档 软件体系架构 软件下载 软著证书 三层架构 设计模式 生成代码 实用小技巧 收钱音箱 数据锁 数据同步 微信小程序 未解决问题 文档下载 喜鹊ERP 喜鹊软件 系统对接 详细设计说明书 行政区域数据库 需求分析 疑难杂症 蝇量级框架 蝇量框架 用户管理 用户开发手册 用户控件 在线支付 纸箱ERP 智能语音收款机 自定义窗体 自定义组件 自动升级程序