0

0

C# 命令模式实现方法 C#如何将请求封装成对象

月夜之吻

月夜之吻

发布时间:2026-03-07 08:17:14

|

667人浏览过

|

来源于php中文网

原创

命令模式的核心是将“调用”封装为可存储传递的对象,通过ICommand接口统一抽象操作,实现调用方与接收者的松耦合;命令应仅转发请求给接收者,避免内嵌业务逻辑,并按需支持Undo、参数校验、上下文注入及生命周期管理。

c# 命令模式实现方法 c#如何将请求封装成对象

命令模式的核心是把“调用”变成可存储、可传递的对象

在 C# 中,命令模式不是靠语法糖实现的,而是靠接口抽象和对象封装。关键在于定义一个统一的 ICommand 接口,让所有请求(比如保存、撤销、发送邮件)都实现它,从而抹平操作差异。这样你就能把 button.Click += SaveHandler 这类紧耦合逻辑,换成 button.Command = new SaveCommand(document) 这种松耦合结构。

常见错误是直接在 Execute() 里写业务逻辑,导致命令类无法复用或测试;正确做法是让命令只负责“转发”,把具体动作委托给接收者(Receiver)——比如 SaveCommand 持有 Document 实例,Execute() 里只调用 _document.Save()

ICommand 接口必须包含 Execute 和 Undo(如果需要撤销)

基础命令至少要有 Execute();支持撤销时,必须同步提供 Undo(),且两者语义要对称。注意:不是所有命令都需要 Undo(),比如“发送短信”这种不可逆操作,接口可以不定义它,或者实现为空——但别抛异常,否则调用方得处处 try-catch。

  • ICommand 接口通常不带泛型,避免过度设计;如需传参,用构造函数注入,而不是在 Execute(object param) 里塞 object
  • 参数应提前验证:比如 DeleteCommand(Guid id) 在构造时就检查 id != Guid.Empty,而不是等到 Execute() 才报错
  • 若命令依赖外部状态(如当前用户权限),不要在 Execute() 里实时查数据库——应在创建命令时把必要上下文(如 CurrentUser)作为只读字段传入

使用委托构造命令可快速原型,但不适合复杂场景

对于简单交互(比如按钮点击触发单行逻辑),可用 Action 封装:

public class SimpleCommand : ICommand
{
    private readonly Action _execute;
    private readonly Action _undo;
<pre class="brush:php;toolbar:false;">public SimpleCommand(Action execute, Action undo = null)
{
    _execute = execute;
    _undo = undo;
}

public void Execute() => _execute();
public void Undo() => _undo?.Invoke();

}

极简智能王
极简智能王

极简智能- 智能聊天AI绘画,还可以创作、编写、翻译、写代码等多种功能,满足用户生活和工作的多方面需求

下载

但这类命令无法序列化、不能带状态、难以调试。一旦涉及重做(Redo)、日志记录、权限校验或异步执行,就得退回到完整类实现——比如把 SaveCommandExecute() 改成 async Task ExecuteAsync(),并继承 IAsyncCommand(自定义接口)。

命令队列与 Invoker 是解耦关键,别让 UI 层直接 new Command

真正体现命令模式价值的地方,是把命令的“生成”“调度”“执行”彻底分离。UI 层(如 ViewModel)只负责创建命令实例并交给 Invoker,而 Invoker 管理执行顺序、事务包装、异常兜底。例如:

  • Invoker 可以批量执行命令并统一提交数据库事务
  • 历史记录功能只需维护一个 Stack<icommand></icommand>,每执行一个就 Push(),点撤销就 Pop().Undo()
  • 避免在 Button_Click 里直接 new SaveCommand(doc) —— 应通过工厂或 DI 容器获取,否则单元测试时无法 Mock 接收者

最容易被忽略的是命令的生命周期管理:如果命令持有大对象引用(如整个 DataTable),又没及时释放,会引发内存泄漏。建议在 Execute() 后清空敏感字段,或用 IDisposable 显式释放。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1846

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

614

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2351

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

47

2026.01.19

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

383

2023.06.29

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2108

2023.08.14

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

357

2023.08.31

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

259

2023.09.05

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

1

2026.03.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10.8万人学习

C 教程
C 教程

共75课时 | 5.2万人学习

C++教程
C++教程

共115课时 | 20.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号