c#设计模式-行为型模式 之 命令模式

🚀简介

命令模式是一种数据驱动的设计模式,在命令模式中,请求在对象中作为命令来封装,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把命令直接传给相应的对象,该对象执行命令。使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象 进行沟通,这样方便将命令对象进行存储、传递、调用、增加与管理。
👻命令模式包含以下主要角色:

  1. 抽象命令类(Command)角色: 定义命令的接口,声明执行的方法。
  2. 具体命令(Concrete Command)角色:具体的命令,实现命令接口;通常会持有接收者,并调用接收者的功能来完成命令要执行的操作。
  3. 实现者/接收者(Receiver)角色: 接收者,真正执行命令的对象。任何类都可能成为一个接收者,只要它能够实现命令要求实现的相应功能。
  4. 调用者/请求者(Invoker)角色: 要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。这个是客户端真正触发命令并要求命令执行相应操作的地方,也就是说相当于使用命令对象的入口。

🚀案例

🐤ICommand接口

这是命令接口,定义了一个执行操作的方法Execute()

cs 复制代码
public interface ICommand
{
    void Execute();
}

🐤具体命令角色ConcreteCommand

实现了ICommand接口。它有一个Receiver对象的引用,并在Execute()方法中调用接收者的Action()方法。

cs 复制代码
public class ConcreteCommand : ICommand
{
    private readonly Receiver _receiver;

    public ConcreteCommand(Receiver receiver)
    {
        _receiver = receiver;
    }

    public void Execute()
    {
        _receiver.Action();
    }
}

🐤实现者/接收者(Receiver)角色

它知道如何执行一个请求相关的操作,这里的操作是输出"执行请求!"。

cs 复制代码
public class Receiver
{
    public void Action()
    {
        Console.WriteLine("执行请求!");
    }
}

🐤调用者/请求者(Invoker)角色

它持有一个命令对象,并在某个时间点调用命令对象的Execute()方法。

cs 复制代码
public class Invoker
{
    private ICommand _command;

    public void SetCommand(ICommand command)
    {
        _command = command;
    }

    public void ExecuteCommand()
    {
        _command.Execute();
    }
}

🐤测试类

调用调用者的ExecuteCommand()方法,从而触发接收者的操作

cs 复制代码
class MyClass
{
    public static void Main(string[] args)
    {
        ICommand command = new ConcreteCommand(new Receiver());
        
        Invoker invoker = new Invoker();

        invoker.SetCommand(command);
        
        invoker.ExecuteCommand();
    }
}

🚀优缺点

优点:

  1. 降低系统的耦合度。命令模式能将调用操作的对象与实现该操作的对象解耦。
  2. 增加或删除命令非常方便。采用命令模式增加与删除命令不会影响其他类,它满足"开闭原则",对扩展比较灵活。
  3. 可以实现宏命令。命令模式可以与组合模式结合,将多个命令装配成一个组合命令,即宏命令。
  4. 方便实现 Undo 和 Redo 操作。命令模式可以与后面介绍的备忘录模式结合,实现命令的撤销与恢复。

缺点:

  1. 使用命令模式可能会导致某些系统有过多的具体命令类。
  2. 系统结构更加复杂。

使用场景

  • 系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。
  • 系统需要在不同的时间指定请求、将请求排队和执行请求。
  • 系统需要支持命令的撤销(Undo)操作和恢复(Redo)操作
相关推荐
张人玉15 分钟前
基于 C# / .NET 8 + Windows Forms + SQLite 的桌面银行业务演示系统——华夏示范银行管理系统
windows·sqlite·c#·.net
1314lay_100717 分钟前
C#调用Sql Server存储过程,并且使用传入表结构
数据库·经验分享·笔记·sqlserver·c#
慧都小妮子1 小时前
.NET 报表控件选型对比:Stimulsoft 与 FastReport 怎么选
c#·.net·报表开发·数据可视化·报表控件·报表引擎选型
1314lay_10073 小时前
C#调用Sql Server存储过程,有返回值的
数据库·sqlserver·c#
czhc11400756633 小时前
2026-09-10 综合博客:异步异常 + 排查核实思维
命令模式
我是唐青枫3 小时前
C#.NET PInvoke 深入解析:封送、内存布局与原生互操作实战
开发语言·c#·.net
Am-Chestnuts3 小时前
AI 生成的数学公式,怎么用 DS随心转 导出成 Word 里能改的公式
人工智能·c#·word
geovindu4 小时前
CSharp: Strategy Pattern
开发语言·后端·c#·.net·.netcore·策略模式·行为模式
古少侠4 小时前
AI 内容粘到 Word 就乱?用 DS随心转 把复制的内容直接变成排版好的一段
人工智能·c#·word
geovindu4 小时前
CSharp: Task Scheduler
开发语言·后端·c#·.net·.netcore