探索设计模式:命令模式

探索设计模式:命令模式

    • [🧐1. 概念](#🧐1. 概念)
    • [🎯2. 作用](#🎯2. 作用)
    • [📦3. 实现](#📦3. 实现)
      • [3.1 定义命令接口](#3.1 定义命令接口)
      • [3.2 实现具体命令](#3.2 实现具体命令)
      • [3.3 实现接收者](#3.3 实现接收者)
      • [3.4 实现调用者](#3.4 实现调用者)
      • [3.5 使用](#3.5 使用)
    • [💻4. 应用场景](#💻4. 应用场景)

  命令模式Command Pattern)就是一种行为型设计模式。其核心思想是将请求封装成一个对象,从而使你可以使用不同的请求、队列或者请求日志参数化其他对象,同时支持可撤销的操作。通过命令模式,可以将请求的发起者和接收者完全解耦,提高系统的灵活性和可扩展性。

🧐1. 概念


  想象一下,当你在家里使用遥控器控制电视时,你按下遥控器上的"电源"按钮,电视就会开启或关闭。在这个过程中,遥控器(调用者)并不知道电视(接收者)是如何工作的,它只是发送了一个"打开"或"关闭"的请求。命令模式正是基于这样的思路,将请求本身封装成一个对象,这样可以更容易地管理和执行请求。

命令模式通常包含四个关键角色:

  1. 命令Command):这是一个抽象类或接口,定义了执行操作的标准方法。所有的具体命令类都实现了这个接口,确保它们可以以统一的方式被调用。
  2. 具体命令Concrete Command):这是命令接口的具体实现,包含了执行操作的具体逻辑。每个具体命令类都关联了一个接收者对象,并且知道如何调用接收者的某个方法来完成任务。
  3. 接收者Receiver):接收者是真正执行命令的对象。它包含了具体的业务逻辑,当一个命令被执行时,实际上是调用了接收者的一个或多个方法。
  4. 调用者Invoker):调用者负责触发命令的执行。它可以持有一个或多个命令对象,并在适当的时候调用命令的执行方法。调用者不需要知道命令的具体实现细节,只需要知道如何调用即可。

🎯2. 作用


  1. 解耦 :命令模式最大的优势在于它能够彻底解耦命令的发起者和接收者,使两者之间的依赖关系降到最低。这意味着可以在不改变原有代码的情况下,轻松地引入新的命令类型或修改现有命令的行为。
  2. 扩展性:由于命令对象实现了统一的接口,因此可以很容易地添加新的命令类,而不会影响到现有的系统接口。此外,命令模式还支持组合命令,即一个命令可以包含多个子命令,形成更复杂的操作序列。

📦3. 实现


  假设我们要开方法一个简单的智能家居控制系统,用户可以通过遥控器(调用者)控制家中的各种电器设备(接收者),如灯光、电视等。

我们可以通过命令模式来实现这一功能。

3.1 定义命令接口


java 复制代码
public interface Command {
    void execute();
}

3.2 实现具体命令


java 复制代码
public class LightOffCommand implements Command {

    private Light light;

    public LightOffCommand(Light light) {
        this.light = light;
    }

    @Override
    public void execute() {
        light.turnOff();
    }
}
public class LightOnCommand implements Command {

    private Light light;

    public LightOnCommand(Light light) {
        this.light = light;
    }

    @Override
    public void execute() {
       light.turnOn();
    }
    
}

3.3 实现接收者


java 复制代码
public class Light {

    public void turnOn(){
        System.out.println("Light is on");
    }

    public void turnOff(){
        System.out.println("Light is off");
    }

}

3.4 实现调用者


java 复制代码
public class RemoteControl {

    private Command command;

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

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

}

3.5 使用


java 复制代码
public class CommandClient {

    public static void main(String[] args) {
        Light light = new Light();
		// 遥控器对象
        RemoteControl remoteControl = new RemoteControl();
		// 具体命令对象
        LightOnCommand lightOnCommand = new LightOnCommand(light);
        LightOffCommand lightOffCommand = new LightOffCommand(light);
		
		// 为遥控器设置命令
        remoteControl.setCommand(lightOnCommand);
        // remoteControl.setCommand(lightOffCommand);
		
		// 按下遥控器按钮
        remoteControl.pressButton();
    }

}

💻4. 应用场景


  1. 用户界面操作:在图形用户界面中,命令模式常用于处理各种用户输入事件,如按钮点击、菜单选择等。通过将这些操作封装成命令对象,界面组件可以独立于具体的业务逻辑,提高了代码的可复用性和可测试性。
  2. 事务管理:在需要支持事务回滚的系统中,命令模式可以帮助实现复杂的撤销/重做功能。每个命令不仅包含执行操作的方法,还可以包含撤销操作的方法,从而在必要时恢复到之前的状态。
  3. 队列处理:当系统需要处理大量异步请求时,可以使用命令模式将请求封装成命令对象并放入队列中等待处理。这中做法有助于平滑负载,避免资源争用。
  4. 日志记录:对于需要记录操作历史以便后续审计或分析的系统,命令模式提供了一种自然的方式来保存命令对象,方便日后查询和恢复。
相关推荐
杨充2 分钟前
2.面向对象的特性
设计模式
杨充2 分钟前
7.SOLID原则案例汇
设计模式·开源·全栈
杨充2 分钟前
8.反模式与坏味道
设计模式·开源·代码规范
杨充12 分钟前
3.接口vs抽象类比较
设计模式
咖啡八杯3 小时前
文法、BNF与AST
java·设计模式·解释器模式·ast·文法
咖啡八杯12 小时前
GoF设计模式——解释器模式
java·后端·spring·设计模式
大数据新鸟15 小时前
设计模式四大基本原则
设计模式
南一Nanyi20 小时前
依赖注入和控制反转
前端·设计模式·nestjs
tiankong12131 天前
如何拓展多态下的子类
设计模式·c#