• 设计模式之命令模式(Command)


    1. 简介

    命名模式将请求封装成一个对象:

    • 从发出者发出命令,发出者不用关心谁接收命令,只要把命令发出即可
    • 从接收者接收命令,接收者不用关心谁发出命令,只要把每次命令接收

    接收者也可以看成命令执行者

    1.1 作用

    • 命令模式解耦了命名发出者和接收者

    优缺点

    ✔ 优点❌ 缺点
    单一职责原则:可以解耦触发和执行操作的类代码可能会变得更加复杂, 因为你在发送者和接收者之间增加了一个全新的层次
    开闭原则:可以在不修改已有客户端代码的情况下在程序中创建新的命令
    可以实现撤销和恢复功能
    可以实现操作的延迟执行
    可以将一组简单命令组合成一个复杂命令

    1.2使用场景

    • 实现操作回滚功能,可以使用命令模式
    • 通过参数来参数化对象,可以用命令模式
    • 将操作放入队列、操作的执行或远程执行操作,可以用命令模式

    现实场景

    在这里插入图片描述

    • 顾客是 Client
    • 厨师是 Receiver
    • 订单是命令

    2. 实现

    2.1 UML 图

    在这里插入图片描述

    • 把命令封装在一个类中:Command 基类
    • 把接收对象封装在一个类中:Receiver
    • Invoker 来调用命令(类似注册回调函数的原理)

    2.2 代码

    Program:

    namespace Command
    {
        class Program
        {
            static void Main(string[] args)
            {
                Invoker invoker = new Invoker();
                SimpleCommand simple = new SimpleCommand("sscc");
                invoker.SetCommand(simple);
                invoker.ExecuteCommand();
    
                Receiver receiver = new Receiver();
                ComplexCommand complex = new ComplexCommand(receiver, "dd", "ee");
                invoker.SetCommand(complex);
                invoker.ExecuteCommand();
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    Invoker:

    namespace Command
    {
        class Invoker
        {
            public Command command;
            
            public void SetCommand(Command command)
            {
                this.command = command;
            }
    
            public void ExecuteCommand()
            {
                command.Execute();
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    Receiver:

    
    using System;
    
    namespace Command
    {
        class Receiver
        {
            public void DoSomething(string str)
            {
                Console.WriteLine("Receiver DoSomething on " + str);
            }
    
            public void DoSomethingElse(string str)
            {
                Console.WriteLine("Receiver DoSomethingElse on " + str);
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    Command:

    namespace Command
    {
        interface Command
        {
            public void Execute() { }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    SimpleCommand:

    using System;
     
    namespace Command
    {
        class SimpleCommand: Command
        {
            private string simplestr = "";
    
            public SimpleCommand(string str)
            {
                simplestr = str;
            }
    
            public void Execute()
            {
                Console.WriteLine("SimpleCommand Execute " + simplestr);
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    ComplexCommand:

    
    using System;
    
    namespace Command
    {
        class ComplexCommand: Command
        {
            private Receiver receiver;
            private string doSomethingStr = "";
            private string doSomethingElseStr = "";
    
            public ComplexCommand(Receiver r,string doSomething,string doSomethingElse)
            {
                receiver = r;
                doSomethingStr = doSomething;
                doSomethingElseStr = doSomethingElse;
            }
    
            public void Execute()
            {
                receiver.DoSomething(doSomethingStr);
                receiver.DoSomethingElse(doSomethingElseStr);
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    F5 运行结果:

    SimpleCommand Execute sscc
    Receiver DoSomething on dd
    Receiver DoSomethingElse on ee


    部分内容参考:命令模式

  • 相关阅读:
    servletContext 对象的解释
    微服务06-Dockerfile自定义镜像+DockerCompose部署多个镜像
    02-Nginx安装与常用命令
    代码技巧: 类中同一个函数可以同时存在常函数版本和普通函数版本(c++)
    MATLAB入门-矩阵的运算
    QGradient(渐变填充)
    矩阵分析与计算学习记录-广义逆矩阵
    基于Python网络爬虫的小说网站数据分析
    从零开始!Jupyter Notebook的安装教程
    广义坐标的理解
  • 原文地址:https://blog.csdn.net/qq_36804363/article/details/126355679