Java命令模式

本文详细介绍了Java中的命令模式,包括模式结构、代码示例,以及其优点(如支持撤销、解耦)和缺点(可能导致系统复杂)。适用于解耦请求执行、支持操作组合的场景。

Java命令模式

1.概述

命令模式是一种行为型设计模式,它将请求封装为一个对象,从而使用户能够用不同的请求参数来进行参数化和传递方法调用。命令模式允许将操作请求的发送者和接收者解耦,即请求发起者并不需要知道请求的具体执行过程是如何完成的,只需要知道接收者可以执行该命令。

2.模式结构

  • 命令(Command):抽象命令类,定义了命令的接口。
  • 具体命令(ConcreteCommand):实现了命令接口,定义了具体命令的执行逻辑。
  • 命令接收者(Receiver):接收者执行命令的逻辑实现。
  • 命令调用者(Invoker):负责调用命令并执行相应的逻辑。
  • 客户端(Client):创建具体的命令,调用者调用命令并执行。

3.代码示例

3.1 命令接口(Command)

public interface Command {
    void execute();
}

3.2 具体命令(ConcreteCommand)

public class LightOnCommand implements Command {
    private LightRecevier light;

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

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

public class LightOffCommand implements Command {
    private LightRecevier light;

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

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

3.3 命令接收者(Receiver)

public class LightRecevier {
    public void on() {
        System.out.println("灯打开了");
    }

    public void off() {
        System.out.println("灯关闭了");
    }
}

3.4 命令调用者(Invoker)

public class SimpleInvoker {
    private Command command;

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

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

3.5 客户端(Client)

public class Client {
    public static void main(String[] args) {
        // 创建接收者对象
        LightRecevier light = new LightRecevier();

        // 创建具体命令对象
        LightOnCommand lightOnCommand = new LightOnCommand(light);
        LightOffCommand lightOffCommand = new LightOffCommand(light);

        // 创建调用者对象
        SimpleInvoker invoker = new SimpleInvoker();

        // 设置具体命令对象
        invoker.setCommand(lightOnCommand);
        invoker.executeCommand();

        invoker.setCommand(lightOffCommand);
        invoker.executeCommand();
    }
}

4.优缺点说明

4.1 优点

  • 支持撤销和重做操作。
  • 容易扩展新的命令或者一组命令。
  • 很容易将单个命令放在队列中启用。
  • 使用命令模式可以使客户端代码与具体执行操作的类解耦。

4.2 缺点

  • 会导致某些系统有过多的具体命令类。
  • 可能这样做会增加系统的复杂性,因为需要新的代码来管理命令关系。

5.适用场景

  • 当需要将发出请求的对象与执行请求的对象解耦时。
  • 当需要在不同的时间指定、排列和执行请求时。
  • 当需要支持撤销、重做和恢复操作时。
  • 当需要将一组操作组合在一起,形成一个类似于面板的操作时。
### Java命令模式概述 命令模式(Command Pattern)是一种行为设计模式,它将请求封装为对象,从而使你可以用不同的请求对客户进行参数化[^1]。该模式能够实现请求发送者与接收者之间的解耦,支持请求的排队、记录日志、撤销/重做等操作。 在Java中,命令模式通常包含以下几个核心角色: - **命令接口(Command Interface)**:定义执行操作的抽象方法,如 `execute()`。 - **具体命令类(Concrete Command)**:实现命令接口,并持有一个接收者对象的引用,负责调用接收者的相应方法来完成请求。 - **接收者(Receiver)**:真正执行请求操作的对象,包含具体的业务逻辑。 - **调用者(Invoker)**:持有命令对象,并通过调用命令对象的 `execute()` 方法来执行请求。 - **客户端(Client)**:创建命令对象并将其与接收者绑定,然后将命令对象传递给调用者。 ### 示例代码 以下是一个简单的Java命令模式实现示例,模拟一个遥控器控制电灯开关的场景。 ```java // 接收者:电灯类 class Light { public void on() { System.out.println("Light is ON"); } public void off() { System.out.println("Light is OFF"); } } // 命令接口 interface Command { void execute(); } // 具体命令:开灯命令 class LightOnCommand implements Command { private Light light; public LightOnCommand(Light light) { this.light = light; } @Override public void execute() { light.on(); } } // 具体命令:关灯命令 class LightOffCommand implements Command { private Light light; public LightOffCommand(Light light) { this.light = light; } @Override public void execute() { light.off(); } } // 调用者:遥控器 class RemoteControl { private Command command; public void setCommand(Command command) { this.command = command; } public void pressButton() { if (command != null) { command.execute(); } } } // 客户端测试类 public class CommandPatternDemo { public static void main(String[] args) { Light livingRoomLight = new Light(); Command onCommand = new LightOnCommand(livingRoomLight); Command offCommand = new LightOffCommand(livingRoomLight); RemoteControl remote = new RemoteControl(); remote.setCommand(onCommand); remote.pressButton(); // 输出: Light is ON remote.setCommand(offCommand); remote.pressButton(); // 输出: Light is OFF } } ``` ### 扩展功能:支持撤销操作 命令模式天然支持撤销操作。只需在命令接口中添加 `undo()` 方法,并在具体命令类中实现其逆向操作即可。 ```java interface Command { void execute(); void undo(); } class LightOnCommand implements Command { private Light light; public LightOnCommand(Light light) { this.light = light; } @Override public void execute() { light.on(); } @Override public void undo() { light.off(); } } ``` 调用者可以维护一个命令历史栈,用于实现多级撤销功能[^1]。 ### 应用场景 命令模式适用于以下场景: - 需要将操作封装成对象,例如GUI按钮、菜单项等。 - 支持事务性操作,如数据库事务回滚。 - 实现宏命令(组合多个命令)或支持命令队列。 - 需要支持命令的撤销和重做功能[^1]。 ### 优点与缺点 **优点:** - 解耦请求发送者与接收者。 - 可扩展性强,新增命令无需修改现有代码。 - 支持命令的组合、排队、日志记录和撤销机制。 **缺点:** - 每个具体命令都需要一个类,可能导致类数量增多。 - 增加系统的复杂度,尤其在简单场景下可能显得过度设计。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值