当前位置: 首页 > article >正文

重修设计模式-行为型-命令模式

重修设计模式-行为型-命令模式

The command pattern encapsulates a request as an object, thereby letting us parameterize other objects with different requests, queue or log requests, and support undoable operations.

命令模式将请求(命令)封装为一个对象,这样可以使用不同的请求参数化其他对象(将不同请求依赖注入到其他对象),并且能够支持请求(命令)的排队执行、记录日志、撤销等(附加控制)功能。

命令模式(Command Pattern)可将请求转换为一个包含与请求相关的所有信息的独立对象。 该转换让你能根据不同的请求将方法参数化、 延迟请求执行或将其放入队列中, 且能实现可撤销操作。

命令模式的核心是将一个个命令封装成一个个对象,从而方便控制和执行。命令模式的主要作用和应用场景,是用来控制命令的执行,比如,异步、延迟、排队执行命令、撤销重做命令、存储命令、给命令记录日志等等。通过命令模式,可以使得请求发送者和接收者之间解耦,从而提高了系统的灵活性和可扩展性。

命令模式主要由以下几个组件构成:

  1. 命令接口(Command):
    • 定义一个用于执行请求的接口。
    • 通常情况下,这个接口会声明一个 execute() 方法,用于执行命令。
  2. 具体命令类(Concrete Command):
    • 实现命令接口,将接收者对象绑定到具体的动作上。
    • 调用接收者的方法来执行请求。
  3. 接收者(Receiver):
    • 知道如何执行与请求相关的操作。
    • 任何类都可以作为接收者对象,只要它能执行与请求相关的操作。
  4. 调用者(Invoker):
    • 要求命令对象执行请求。
    • 它持有一个命令对象的引用,可以在需要时调用该命令。
  5. 客户端(Client):
    • 创建具体的命令对象,并设置其接收者。
    • 将命令对象传递给调用者。

举个例子,用命令模式实现灯的开关控制场景。

// 1.接收者(Receiver),封装了请求相关的操作。
class Light {  
    public void on() {  
        System.out.println("Light is on");  
    }  
  
    public void off() {  
        System.out.println("Light is off");  
    }  
}  
  
// 2.命令接口(Command)
interface Command {  
    void execute();  
}  
  
// 3.具体命令类:开灯命令  
class LightOnCommand implements Command {  
    private Light light;  
  
    public LightOnCommand(Light light) {  
        this.light = light;  
    }  
  
    @Override  
    public void execute() {  
        light.on();  
    }  
}  
  
// 3.具体命令类:关灯命令  
class LightOffCommand implements Command {  
    private Light light;  
  
    public LightOffCommand(Light light) {  
        this.light = light;  
    }  
  
    @Override  
    public void execute() {  
        light.off();  
    }  
}  
  
// 4.调用者(Invoker)  
class RemoteControl {  
    private Command command;  
  
    public void setCommand(Command command) {  
        this.command = command;  
    }  
  
    public void pressButton() {  
        command.execute();  
    }  
}  
  
// 5.客户端(Client)  
public class Client {  
    public static void main(String[] args) {  
      	//创建接收者
        Light light = new Light();  
        
      	//创建命令
        Command lightOnCommand = new LightOnCommand(light);  
        Command lightOffCommand = new LightOffCommand(light);  
        
      	//创建调用者并与特定命令关联
        RemoteControl remoteControl = new RemoteControl();  
        remoteControl.setCommand(lightOnCommand);  
        remoteControl.pressButton(); // 输出: Light is on  
        remoteControl.setCommand(lightOffCommand);  
        remoteControl.pressButton(); // 输出: Light is off  
    }  
}

总结

命令模式的主要作用和应用场景,是用来控制命令的执行,比如,异步、延迟、排队执行命令、撤销重做命令、存储命令、给命令记录日志等等,这才是命令模式能发挥作用的地方。


http://www.kler.cn/a/398042.html

相关文章:

  • AntFlow:一款高效灵活的开源工作流引擎
  • 【Linux】Ubuntu中muduo库的编译环境安装
  • 微信小程序设置屏幕安全距离
  • IDEA2024:右下角显示内存
  • PostgreSQL TRUNCATE TABLE
  • 常见的测试方法
  • 【深度学习】模型参数冻结:原理、应用与实践
  • SpringBoot(二十五)SpringBoot集成JRebel实现热更新
  • Scratch 014生日贺卡(上)
  • 使用ACF插件向WooCommerce商城产品添加自定义字段
  • Net C# Nullable<T> Nullable、null、?
  • MPTCP协议
  • java基础知识全集(一篇看到爽)(持续更新中)
  • shell编程--永久环境变量和字符串显位
  • 【C#设计模式(7)——桥接模式(Bridge Pattern)】
  • wireshark演进之路——从GTK到Qt
  • 分布式,微服务,SpringCloudAlibaba,nacos,gateway,openFeign
  • Docker内存溢出报错问题解决
  • SpringMVC数据校验、数据格式化处理、国际化设置
  • 网络IP地址会经常换吗?深入解析与实操指南
  • 金山云大数据面试题及参考答案
  • Python爬虫定义入门知识
  • 【Linux庖丁解牛】—Linux基本指令(下)!
  • 黑马智数Day7
  • 对称加密算法DES的实现
  • 130. CSS2DRenderer(HTML标签)