首页 > 其他分享 >命令模式,这么学就很简单!

命令模式,这么学就很简单!

时间:2024-01-03 19:32:28浏览次数:38  
标签:模式 命令 遥控器 device 简单 Device 操作 public

什么是命令模式?

命令模式是一种行为型设计模式,核心是将每种请求或操作封装为一个独立的对象,从而可以集中管理这些请求或操作,比如将请求队列化依次执行、或者对操作进行记录和撤销。

命令模式通过将请求的发送者(客户端)和接收者(执行请求的对象)解耦,提供了更大的灵活性和可维护性。

听不懂上面这句话很正常,我来举个例子。

我们在生活中都用过电视机,我们就相当于客户端,要操作电视来换台;而电视就是执行请求的对象,要根据我们的操作来换台。但是我们一般不会直接按电视上的按钮来换台,而是用一个遥控器,通过点击遥控器上的操作按钮来控制电视。

这样就相当于把我们和电视解耦了。哪怕遥控器丢了,再换一个遥控器就好了;而且现在手机都能作为万能的电视遥控器,我们可以同时遥控多个品牌的设备,不用关心设备的具体品牌型号,提供了更大的方便。

命令模式的优点和应用场景

正如上面的例子,命令模式最大的优点就是解耦请求发送者和接受者,让系统更加灵活、可扩展。

由于每个操作都是一个独立的命令类,所以我们需要新增命令操作时,不需要改动现有代码。

命令模式典型的应用场景:

  • 系统需要统一处理多种复杂的操作,比如操作排队、记录操作历史、撤销重做等。
  • 系统需要持续增加新的命令、或者要处理复杂的组合命令(子命令),使用命令模式可以实现解耦。

命令模式的要素和实现

通过上面用户使用遥控器来操作电视机设备的例子,带大家理解命令模式的关键要素和实现代码。

1)命令

相当于遥控器操作按钮的制作规范

命令是一个抽象类或接口,它定义了执行操作的方法,通常是execute,该方法封装了具体的操作。

代码如下:

public interface Command {
    void execute();
}

2)具体命令

相当于遥控器的某个操作按钮

具体命令是命令接口的具体实现类,它负责将请求传递给接收者(设备)并执行具体的操作。

比如定义一个关闭设备命令,代码如下:

public class TurnOffCommand implements Command {
    private Device device;

    public TurnOffCommand(Device device) {
        this.device = device;
    }

    public void execute() {
        device.turnOff();
    }
}

还可以定义开启设备命令,代码如下:

public class TurnOnCommand implements Command {
    private Device device;

    public TurnOnCommand(Device device) {
        this.device = device;
    }

    public void execute() {
        device.turnOn();
    }
}

3)接受者

相当于被遥控的设备

接收者是最终执行命令的对象,知道如何执行具体的操作。

比如定义一个设备类,代码如下:

public class Device {
    private String name;

    public Device(String name) {
        this.name = name;
    }

    public void turnOn() {
        System.out.println(name + " 设备打开");
    }

    public void turnOff() {
        System.out.println(name + " 设备关闭");
    }
}

4)调用者

相当于遥控器

作用是接受客户端的命令并执行。

比如定义遥控器类,代码如下:

public class RemoteControl {
    private Command command;

    public void setCommand(Command command) {
        this.command = command;
    }

    public void pressButton() {
        command.execute();
    }
}

以上只是最基础的调用者类,还可以给遥控器类增加更多能力,比如存储历史记录、撤销重做等。

5)客户端

相当于使用遥控器的人

客户端的作用是创建命令对象并将其与接收者关联(绑定设备),然后将命令对象传递给调用者(按遥控器),从而触发执行。

示例客户端代码如下:

public class Client {
    public static void main(String[] args) {
        // 创建接收者对象
        Device tv = new Device("TV");
        Device stereo = new Device("Stereo");

        // 创建具体命令对象,可以绑定不同设备
        TurnOnCommand turnOn = new TurnOnCommand(tv);
        TurnOffCommand turnOff = new TurnOffCommand(stereo);

        // 创建调用者
        RemoteControl remote = new RemoteControl();

        // 执行命令
        remote.setCommand(turnOn);
        remote.pressButton();

        remote.setCommand(turnOff);
        remote.pressButton();
    }
}

在这个示例中,命令模式将遥控器按钮的按下操作与实际设备的开关操作解耦,从而实现了灵活的控制和可扩展性。

整个程序的 UML 类图如下:

命令模式,这么学就很简单!_计算机

推荐学习

鱼皮独立开发的 yuindex 网页终端项目,就是以命令模式为核心实现的,前后端同学都可以学习:https://github.com/liyupi/yuindex

实践

编程导航星球的定制化代码生成项目就是使用了命令模式来开发命令行应用。


标签:模式,命令,遥控器,device,简单,Device,操作,public
From: https://blog.51cto.com/u_15016006/9088131

相关文章

  • 低代码开发:革新企业应用创新模式
    在当前信息化社会中,企业的运营管理和业务流程越来越依赖于各种应用程序。然而,传统的软件开发方式往往需要大量的专业技术人员和长时间的开发周期,这无疑给企业带来了很大的压力。因此,一种新型的软件开发方法——“低代码”应运而生。低代码是一种以图形化界面和配置为主导的应用程序......
  • 外观模式
    实验12:外观模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解外观模式的动机,掌握该模式的结构;2、能够利用外观模式解决实际问题。[实验任务]:计算机开启在计算机主机(Mainframe)中,只需要按下主机的开机按钮(on()),即可调用其他硬件设备和软件的启动方法,如内存(......
  • 【设计模式】单例模式——反序列化破坏单例模式的情景
    一个单例对象创建好之后,有时候需要将对象序列化然后进行数据持久化,下次使用的时候通过反序列化转化为内存对象。反序列化后的对象会重新分配内存,会破坏单例模式。首先看支持序列化的单例类的代码://实现Serializable即可实现序列化和反序列化publicclassSingletonimplementsSe......
  • MongoDB中查询命令
    基础查询:db.collection.find({})//查询集合中的所有文档条件查询:db.collection.find({field:value})//查询field字段值为value的文档比较查询:$eq:等于$ne:不等于$gt:大于$gte:大于或等于$lt:小于$lte:小于或等于db.collection.find({age:{$gt:20}}......
  • 字符集和编码格式的简单学习
    字符集和编码格式的简单学习背景因为遇到了一个数据库乱码的问题,所以想着能够学习和总结一下字符集和编码格式相关的内容内容可能比较宏大,我这边能够写的可能不是很多.希望是一个完善和提高自己的机会学习的资料https://deerchao.cn/blog/posts/unicode.html大佬的文档很牛......
  • Redis 之基本命令
    一、基本命令1、ping心跳命令2、get/set(读写键值命令)3、select(切换数据库)4、dbsize(查看key数量)5、flushdb(删除当前库中所有数据)6、flushall(删除所有DB中的数据) ......
  • mqtt 共享订阅简单说明
    mqtt是一个比较常用的iot协议,5.0支持共享订阅,共享订阅是一个特别方便的功能,可以实现业务的高可用,以及提升消息的处理参考格式共享订阅格式$share/{ShareName}/{TopicFilter}ShareName是一个共享名称,可以实现业务组的能力,TopicFilter}可以对于订阅消息的过滤处理参考玩法简......
  • dremio nessie数据源集成简单说明
    nessie是一个强大的支持类似git分之特性的apacheiceberg智能元数据存储,主要测试下基于nessiedremio元数据存储(catalog)集成参考架构环境准备docker-compose文件version:"3"services:minio:image:minio/minioports:-"9000:9000"-"19001:190......
  • rustler 简单试用
    昨天简单说了基于mrml包装的elixirmjml_nif模块,其中使用了rustler进行elixir与rust的构建集成(基于了nif)以下是一个简单的rustler学习试用项目准备基于mix初始化初始化项目 mixnewdalong添加依赖mix.exs defpdepsdo[{:rustler,"~>0.30.0"}]执行依......
  • rustler-precompiled rustler 扩展工具简单说明
    已经简单说过mjml_nif使用了rustler+rustler-precompiled进行nif的构建,同时官方也写了一篇相关的博客进行介绍使用说明配置依赖defdepsdo[{:rustler_precompiled,"~>0.7"}]end配置native使用可以是一个独立的模块,命名上可以添加Native比较符合习惯 defmodul......