设计模式(行为型模式)命令模式

目录

    • 一、简介
    • 二、命令模式
      • 2.1、命令接口
      • 2.2、具体命令
      • 2.3、接收者
      • 2.4、调用者
      • 2.5、使用
    • 三、优点与缺点

一、简介

  命令模式(Command Pattern)是一种行为设计模式,它允许将请求或操作封装为一个单独的对象。这种模式允许参数化方法调用,将方法调用、请求或操作封装成一个对象,从而可以在不同的时间将请求排队、记录请求日志、撤销操作等。

  命令模式的核心思想是将请求封装成一个对象,使得请求的发送者和接收者解耦。发送者只需知道如何发送命令,并不需要知道接收者如何处理命令、何时执行命令以及具体的命令细节。这种模式通常包含以下关键角色:

  • 命令(Command): 定义了执行操作的接口,包含了执行命令的方法。
  • 具体命令(Concrete Command): 实现了命令接口,负责执行具体的操作。
  • 接收者(Receiver): 知道如何执行与请求相关的操作。
  • 调用者/客户端(Invoker/Client): 负责创建命令对象,并指定命令的接收者。

通过使用命令模式,可以实现命令的撤销、重做、记录日志、批处理等功能,同时提供了更加灵活的命令处理方式。

二、命令模式

  假设我们有一个遥控车(Receiver),并使用命令模式来模拟遥控器发送命令控制遥控车的移动。

2.1、命令接口

// 命令接口
public interface Command {
    void execute();
}

2.2、具体命令

// 具体命令 - 向前移动
public class MoveForwardCommand implements Command {
    private Car car;

    public MoveForwardCommand(Car car) {
        this.car = car;
    }

    @Override
    public void execute() {
        car.moveForward();
    }
}

// 具体命令 - 向后移动
public class MoveBackwardCommand implements Command {
    private Car car;

    public MoveBackwardCommand(Car car) {
        this.car = car;
    }

    @Override
    public void execute() {
        car.moveBackward();
    }
}

2.3、接收者

// 接收者 - 遥控车
public class Car {
    public void moveForward() {
        System.out.println("汽车向前移动");
    }

    public void moveBackward() {
        System.out.println("汽车向后移动");
    }
}

2.4、调用者

// 调用者 - 遥控器
public class RemoteControl {
    private Command forwardCommand;
    private Command backwardCommand;

    public RemoteControl(Command forwardCommand, Command backwardCommand) {
        this.forwardCommand = forwardCommand;
        this.backwardCommand = backwardCommand;
    }

    public void pressForwardButton() {
        forwardCommand.execute();
    }

    public void pressBackwardButton() {
        backwardCommand.execute();
    }
}

2.5、使用

// 测试类
public class RemoteControlCarExample {
    public static void main(String[] args) {
        Car car = new Car();
        Command moveForwardCommand = new MoveForwardCommand(car);
        Command moveBackwardCommand = new MoveBackwardCommand(car);

        RemoteControl remoteControl = new RemoteControl(moveForwardCommand, moveBackwardCommand);

        remoteControl.pressForwardButton();
        remoteControl.pressBackwardButton();
    }
}

运行结果:

汽车向前移动
汽车向后移动

三、优点与缺点

  命令模式有以下优点和缺点:

优点

  • 松耦合: 命令模式将请求发送者和接收者解耦,发送者不需要知道接收者的具体实现,只需知道如何发送命令。
  • 可扩展性: 可以方便地添加新的命令或修改现有命令,而无需修改调用者的代码。
  • 撤销和恢复操作: 可以轻松实现命令的撤销和重做操作,因为命令对象可以存储操作的状态。
  • 记录日志和审计: 可以记录命令的执行历史,用于日志记录、审计等场景。

缺点

  • 类爆炸: 如果系统中有大量的命令,可能会导致命令类的数量急剧增加,造成类爆炸。
  • 增加复杂性: 引入命令模式会增加额外的类和对象,可能会增加系统复杂性,特别是对于简单的命令操作而言。
  • 命令的具体实现: 每个具体命令都需要一个具体的实现类,如果命令逻辑较为简单,会导致类的数量增加。

  尽管命令模式有一些缺点,但它仍然是一种有用的设计模式,特别是当需要实现撤销、重做、日志记录等功能时,命令模式可以提供一种简洁而可靠的解决方案。

你可能感兴趣的:(设计模式,设计模式,命令模式)