跳转到内容

Java命令模式

来自代码酷
Admin留言 | 贡献2025年4月30日 (三) 19:04的版本 (Page creation by admin bot)

(差异) ←上一版本 | 已核准修订 (差异) | 最后版本 (差异) | 下一版本→ (差异)

Java命令模式[编辑 | 编辑源代码]

命令模式(Command Pattern)是一种行为设计模式,它将请求或操作封装为一个对象,从而使你可以参数化客户端与不同的请求、队列或日志请求,并支持可撤销的操作。这种模式的主要目的是将“发出请求的对象”和“接收与执行这些请求的对象”解耦。

介绍[编辑 | 编辑源代码]

在软件开发中,命令模式用于将方法调用(即操作或请求)封装成对象。这使得这些操作可以被传递、存储、延迟执行或撤销。命令模式通常包含以下几个关键组件:

  • 命令(Command):一个接口或抽象类,声明执行操作的方法(如`execute()`)。
  • 具体命令(ConcreteCommand):实现命令接口的具体类,通常包含接收者对象并调用接收者的方法来完成操作。
  • 接收者(Receiver):实际执行操作的对象,知道如何完成请求。
  • 调用者(Invoker):持有命令对象并触发命令的执行。
  • 客户端(Client):创建具体的命令对象并设置其接收者。

命令模式的核心思想是将“请求”本身作为一个对象,从而允许用户参数化其他对象,如队列、日志或撤销操作。

结构[编辑 | 编辑源代码]

以下是命令模式的类图表示:

classDiagram class Command { <<interface>> +execute() } class ConcreteCommand { -receiver: Receiver +execute() } class Receiver { +action() } class Invoker { -command: Command +setCommand(Command) +executeCommand() } class Client { } Command <|-- ConcreteCommand ConcreteCommand o-- Receiver Invoker o-- Command Client ..> ConcreteCommand Client ..> Receiver

代码示例[编辑 | 编辑源代码]

以下是一个简单的Java实现示例,展示如何使用命令模式控制电灯的开关:

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

// 接收者:电灯
class Light {
    public void turnOn() {
        System.out.println("Light is ON");
    }

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

// 具体命令:开灯
class TurnOnLightCommand implements Command {
    private Light light;

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

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

// 具体命令:关灯
class TurnOffLightCommand implements Command {
    private Light light;

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

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

// 调用者:遥控器
class RemoteControl {
    private Command command;

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

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

// 客户端代码
public class CommandPatternDemo {
    public static void main(String[] args) {
        Light light = new Light();
        Command turnOn = new TurnOnLightCommand(light);
        Command turnOff = new TurnOffLightCommand(light);

        RemoteControl remote = new RemoteControl();

        remote.setCommand(turnOn);
        remote.pressButton(); // 输出: Light is ON

        remote.setCommand(turnOff);
        remote.pressButton(); // 输出: Light is OFF
    }
}

输出[编辑 | 编辑源代码]

Light is ON
Light is OFF

实际应用场景[编辑 | 编辑源代码]

命令模式在以下场景中非常有用:

1. GUI 按钮和菜单项:在图形用户界面中,按钮或菜单项可以绑定到命令对象,从而在点击时执行特定操作。 2. 事务管理:数据库事务可以使用命令模式实现,支持回滚操作。 3. 宏命令:将多个命令组合成一个宏命令,一次性执行多个操作。 4. 任务队列:将命令对象存储在队列中,按顺序或延迟执行。

示例:宏命令[编辑 | 编辑源代码]

以下是一个宏命令的示例,它组合了多个命令:

class MacroCommand implements Command {
    private List<Command> commands = new ArrayList<>();

    public void addCommand(Command command) {
        commands.add(command);
    }

    @Override
    public void execute() {
        for (Command command : commands) {
            command.execute();
        }
    }
}

// 客户端代码
public class MacroCommandDemo {
    public static void main(String[] args) {
        Light light = new Light();
        Command turnOn = new TurnOnLightCommand(light);
        Command turnOff = new TurnOffLightCommand(light);

        MacroCommand macro = new MacroCommand();
        macro.addCommand(turnOn);
        macro.addCommand(turnOff);

        RemoteControl remote = new RemoteControl();
        remote.setCommand(macro);
        remote.pressButton(); // 依次执行开灯和关灯
    }
}

输出[编辑 | 编辑源代码]

Light is ON
Light is OFF

优缺点[编辑 | 编辑源代码]

优点[编辑 | 编辑源代码]

  • 解耦调用者和接收者,调用者无需知道接收者的具体实现。
  • 支持撤销和重做操作(通过存储命令历史)。
  • 支持组合命令(如宏命令)。
  • 易于扩展新的命令,无需修改现有代码。

缺点[编辑 | 编辑源代码]

  • 可能导致类的数量增加,每个具体命令都需要一个单独的类。
  • 在某些情况下,命令对象的生命周期管理可能变得复杂。

总结[编辑 | 编辑源代码]

命令模式是一种强大的设计模式,特别适用于需要将操作封装为对象并支持撤销、队列或日志的场景。通过将请求的发送者和接收者解耦,命令模式提高了代码的灵活性和可维护性。初学者可以通过简单的示例(如电灯控制)理解其核心思想,而高级用户可以利用它实现更复杂的系统(如事务管理或任务调度)。