• 23种设计模式之命令模式(Command Pattern)


    前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将23种设计模式中的命令模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。
    如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
    小威在此先感谢各位大佬啦~~🤞🤞
    在这里插入图片描述

    🏠个人主页:小威要向诸佬学习呀
    🧑个人简介:大家好,我是小威,一个想要与大家共同进步的男人😉😉
    目前状况🎉:24届毕业生,在一家满意的公司实习👏👏

    💕欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘

    以下正文开始
    在这里插入图片描述

    命令模式概念

    命令模式(Command Pattern)是一种行为型设计模式,它将请求或操作封装成一个对象,从而使不同的请求可以被异步、延迟、排队,或者记录下来以备撤销或重做等操作。命令模式可以将客户端和接收者解耦,提高系统的灵活性与可扩展性。

    命令模式角色

    命令模式包含如下几个主要角色:

    命令(Command):定义了执行操作的接口,包含了执行该命令所需的所有必要信息。

    具体命令(Concrete Command):实现了命令接口,它包含了一个接收者对象,并完成具体的命令操作。

    接收者(Receiver):执行命令的对象,真正的命令执行者。

    调用者(Invoker):发出命令并要求执行命令的对象,通常会持有命令对象,并通过命令对象来执行具体的操作。

    客户端(Client):创建具体的命令对象,并将其设置到调用者中,然后发起调用者的请求。

    命令模式注意事项

    在使用命令模式时,需要注意以下几点:

    尽量将每个命令实现为一个独立的类,这样可以方便地扩展新的命令类型。

    命令对象可以被序列化,并且命令队列支持保存和恢复操作,从而可以实现日志记录、撤销和重做等功能。

    可以使用组合模式将命令组合成宏命令,从而可以批量执行多个命令。

    在有些场景下,可以使用命令模式来代替回调函数(callback),从而避免回调函数带来的复杂度和耦合性。

    命令模式案例

    接下来通过一个案例来学习命令模式,此案例展示了如何使用命令模式将请求封装成对象,并实现撤销操作:

    // 定义命令接口
    interface Command {
        void execute();
        void undo();
    }
    
    // 实现具体命令对象
    class LightOnCommand implements Command {
        private final Light light;
        private boolean lastState;
    
        public LightOnCommand(Light light) {
            this.light = light;
        }
    
        @Override
        public void execute() {
            lastState = light.isOn();
            light.turnOn();
        }
    
        @Override
        public void undo() {
            if (lastState) {
                light.turnOn();
            } else {
                light.turnOff();
            }
        }
    }
    
    // 实现接收者对象
    class Light {
        private boolean isOn = false;
    
        public boolean isOn() {
            return isOn;
        }
    
        public void turnOn() {
            isOn = true;
            System.out.println("Light is on");
        }
    
        public void turnOff() {
            isOn = false;
            System.out.println("Light is off");
        }
    }
    
    // 实现调用者对象
    class RemoteControl {
        private final Command command;
    
        public RemoteControl(Command command) {
            this.command = command;
        }
    
        public void pressButton() {
            command.execute();
        }
    
        public void pressUndo() {
            command.undo();
        }
    }
    
    // 客户端代码
    public class Client {
        public static void main(String[] args) {
            // 创建接收者对象
            Light light = new Light();
    
            // 创建具体命令对象
            LightOnCommand onCommand = new LightOnCommand(light);
    
            // 创建调用者对象,并设置命令对象
            RemoteControl remoteControl = new RemoteControl(onCommand);
    
            // 发起请求
            remoteControl.pressButton();
    
            // 撤销请求
            remoteControl.pressUndo();
        }
    }
    
    • 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
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86

    在上面的示例代码中,我们使用命令模式将打开电灯的操作封装成了一个命令对象 LightOnCommand,并通过调用者对象 RemoteControl 来发起请求。客户端可以根据需要创建不同的命令对象,并将其设置到调用者对象中,然后通过调用调用者对象的方法来执行具体的命令操作。

    命令模式还支持命令队列、宏命令和日志记录等高级特性,可以根据具体的场景选择适合的方式来使用命令模式。

    命令模式小结

    命令模式(Command Pattern)是一种优秀的行为型设计模式,它将一个请求封装成一个对象,从而使得请求发起者与请求接收者解耦,并可支持撤销、重做等功能。通过使用命令模式,可以极大地提高代码复用性、灵活性和可扩展性。

    好了,本篇文章就先分享到这里了,后续将会继续介绍23种设计模式之其他模式,感谢大佬认真读完支持咯~
    在这里插入图片描述

    文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起讨论😁
    希望能和诸佬们一起努力,今后我们顶峰相见🍻
    再次感谢各位小伙伴儿们的支持🤞

    在这里插入图片描述

  • 相关阅读:
    微信小程序控制元素显示隐藏
    汇编语言学习
    2022“杭电杯”中国大学生算法设计超级联赛(7)
    TensorFlow 的基本概念和使用场景
    【JAVA-Day15】Java 的 do-while 循环语句
    C#学习系列之ListView垂直滚动
    【模型训练】YOLOv7训练visdrone数据集
    Python中Collections模块Counter用法
    Git 内容学习
    一文搞懂EMAS Serverless小程序开发|电子书免费下载
  • 原文地址:https://blog.csdn.net/qq_53847859/article/details/130883957