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)操作
相关推荐
用户3721574261358 小时前
如何使用 C# 将 CSV 数据轻松转换为 PDF
c#
欠你一个bug10 小时前
Java设计模式应用--装饰器模式
java·设计模式·装饰器模式
LoveXming15 小时前
Chapter14—中介者模式
c++·microsoft·设计模式·中介者模式·开闭原则
崎岖Qiu17 小时前
【设计模式笔记06】:单一职责原则
java·笔记·设计模式·单一职责原则
Yeniden17 小时前
【设计模式】适配器模式大白话讲解!
设计模式·适配器模式
金色熊族21 小时前
装饰器模式(c++版)
开发语言·c++·设计模式·装饰器模式
西红柿维生素1 天前
23种设计模式-框架中的使用
java·开发语言·设计模式
未孤_有青山1 天前
库卡机器人通讯-EtherKRL-XML格式
xml·c#
数据知道1 天前
Go语言设计模式:桥接模式详解
设计模式·golang·桥接模式
課代表1 天前
VB.NET 与 C# 文件操作文本到二进制文件的读写
c#·二进制文件·vb.net·streamwriter·文本文件·读写·streamreader