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

news/2024/5/19 23:40:07 标签: 设计模式, c#, .netcore, 命令模式, 行为型模式

🚀简介

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

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

🚀案例

🐤ICommand接口

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

public interface ICommand
{
    void Execute();
}

 🐤具体命令角色ConcreteCommand

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

public class ConcreteCommand : ICommand
{
    private readonly Receiver _receiver;

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

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

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

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

public class Receiver
{
    public void Action()
    {
        Console.WriteLine("执行请求!");
    }
}

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

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

public class Invoker
{
    private ICommand _command;

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

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

🐤测试类

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

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)操作

http://www.niftyadmin.cn/n/5068388.html

相关文章

Android 11.0 mt6771新增分区功能实现三

1.前言 在11.0的系统开发中,在对某些特殊模块中关于数据的存储方面等需要新增分区来保存, 所以就需要在系统分区新增分区,接下来就来实现这个功能,看系列三的实现过程 2.mt6771新增分区功能实现三的核心类 build/make/tools/releasetools/common.py device/mediatek/mt6…

计算机专业毕业设计项目推荐13-超酷炫轻食平台(Go/Java+Vue+Mysql)

超酷炫轻食平台(Go/JavaVueMysql) **介绍****各部分模块实现** 介绍 本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以也比较了解计算机专业的毕业设计流程以及模式,在编写的过…

Linux Vi编辑器基础操作指南

Linux Vi编辑器基础操作指南 Linux中的Vi是一个强大的文本编辑器,虽然它有一些陡峭的学习曲线,但一旦掌握了基本操作,它就变得非常高效。以下是Vi编辑器的一些基本用法: 打开Vi编辑器: vi 文件名退出Vi编辑器&#xff…

linux内核分析:虚拟化

https://www.cnblogs.com/wujuntian/p/16294898.html 三种虚拟化方式 1. 对于虚拟机内核来讲,只要将标志位设为虚拟机状态,我们就可以直接在 CPU 上执行大部分的指令,不需要虚拟化软件在中间转述,除非遇到特别敏感的指令,才需要将标志位设为物理机内核态运行,这样大大…

数据结构—归并排序-C语言实现

引言:归并排序跟快速排序一样,都运用到了分治的算法,但是归并排序是一种稳定的算法,同时也具备高效,其时间复杂度为O(N*logN) 算法图解: 然后开始归并: 就是这个思想,拆成最小子问题…

LRU 缓存 -- 哈希链表

相关题目 146. LRU 缓存 要让 put 和 get ⽅法的时间复杂度为 O(1),我们可以总结出 cache 这个数据结构必要的条件: 1、显然 cache 中的元素必须有时序,以区分最近使⽤的和久未使⽤的数据,当容量满了之后要删除最久未使⽤的那个元…

基于SpringBoot的车辆管理系统

目录 前言 一、技术栈 二、系统功能介绍 员工信息管理 证件信息管理 车辆信息管理 事故登记管理 事故登记 保养登记 违章登记 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实…

即时通讯软件

通信协议 发送消息可以是个struct 客户端分两个线程:读取服务器,给服务器发(否则会导致阻塞) read和write的第二个参数类型是:void *buf——————不仅仅是一个字符串,也可以是一个结构体等等&#xf…