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)操作
相关推荐
bugcome_com5 小时前
零基础入门C#:一篇搞懂核心知识点
c#
J_liaty9 小时前
23种设计模式一代理模式
设计模式·代理模式
程序员敲代码吗9 小时前
如何通过命令行启动COMSOL的参数化、批处理和集群扫描
java·c#·bash
缺点内向11 小时前
C#: 告别繁琐!轻松移除Word文档中的文本与图片水印
c#·自动化·word·.net
喵叔哟11 小时前
06-ASPNETCore-WebAPI开发
服务器·后端·c#
2501_9307077812 小时前
使用 C# .NET 从 PowerPoint 演示文稿中提取背景图片
c#·powerpoint·.net
初级代码游戏12 小时前
套路化编程 C# winform 自适应缩放布局
开发语言·c#·winform·自动布局·自动缩放
大空大地202613 小时前
流程控制语句--switch多分支语句使用、while循环语句的使用、do...while语句、for循环
c#
苏渡苇15 小时前
优雅应对异常,从“try-catch堆砌”到“设计驱动”
java·后端·设计模式·学习方法·责任链模式
kylezhao201915 小时前
C#序列化与反序列化详细讲解与应用
c#