1. 设计模式之命令模式:给其他模块下达命令

1.1. 介绍

命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式

命令模式将一个请求封装为一个对象,从而使你可以用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的操作。

常见场景,例如系统赠送积分业务,可以将积分操作封装成命令,可以赠送积分,也可以撤销赠送的积分。

1.2. 优缺点及建议

优点

  1. 解耦请求发送者和接收者。
  2. 支持扩展新命令(开闭原则)。
  3. 支持撤销/重做操作。

缺点

  1. 每个命令需单独实现类,可能增加代码量。
  2. 复杂系统可能需要多层命令结构。

使用建议

  1. 简单场景:直接实现基础命令模式。
  2. 复杂场景:结合备忘录模式(Memento)实现多层撤销。

注意事项

  • 如果系统需要支持命令的撤销(Undo)和恢复(Redo)操作,命令模式是一个合适的选择。

1.3. 实现及相关代码

接口及数据对象

public interface Command {
    void execute();
    void undo();
}

public static class CommandA implements Command {
    public void execute() {
        System.out.println("命令A的功能逻辑");
    }

    public void undo() {
        System.out.println("撤销命令A的功能逻辑");
    }
}

public static class CommandB implements Command {
    public void execute() {
        System.out.println("命令B的功能逻辑");
    }

    public void undo() {
        System.out.println("撤销命令B的功能逻辑");
    }
}

public static class Invoker {
    private Command command;

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

    public void execute() {
        System.out.println("一些别的逻辑A");
        command.execute();
        System.out.println("一些别的逻辑B");
    }

    public void undo() {
        command.undo();
    }
}

调用方法

public static void main(String[] args) {
    Command commandA = new CommandA();
    Command commandB = new CommandB();
    Invoker invoker = new Invoker();

    invoker.setCommand(commandA);
    invoker.execute();
    invoker.undo();

    invoker.setCommand(commandB);
    invoker.execute();
    invoker.undo();
}

results matching ""

    No results matching ""