Java实现命令模式

命令模式是一种行为型设计模式,它将请求封装成一个对象,从而使发送请求的对象和处理请求的对象解耦。通过将请求封装成对象,命令模式允许请求参数化,支持对请求进行排队、记录操作日志、撤销和重做操作。 适用的场景: 1. 需要将具体的请求与处理请求的对象解耦时,可以使用命令模式。 2. 需要支持操作的撤销和重做功能时,可以使用命令模式。 3. 需要对请求进行排队、记录日志等处理时,可以使用命令模式。 4. 需要将一组操作组合成一个命令时,可以使用命令模式。 命令模式的好处: 1. 降低系统耦合度:发送者和接收者之间松耦合,发送者不需要知道接收者的具体实现。 2. 容易扩展新命令:新增一个命令不会影响其他已有的命令,易于添加和维护。 3. 支持撤销和重做操作:通过保存命令的历史记录,可以实现撤销和重做功能。 下面是一个简单的Java命令模式示例代码: 首先定义一个命令接口Command: ```java public interface Command { void execute(); } ``` 然后实现命令接口,创建具体的命令类,比如打开电视命令、关闭电视命令: ```java public class OpenTVCommand implements Command { private Television tv; public OpenTVCommand(Television tv) { this.tv = tv; } @Override public void execute() { tv.open(); } } public class CloseTVCommand implements Command { private Television tv; public CloseTVCommand(Television tv) { this.tv = tv; } @Override public void execute() { tv.close(); } } ``` 再创建命令的执行者,比如电视类: ```java public class Television { public void open() { System.out.println("打开电视"); } public void close() { System.out.println("关闭电视"); } } ``` 最后创建一个命令调用者,调用者可以接收命令并执行: ```java public class CommandInvoker { private Command command; public void setCommand(Command command) { this.command = command; } public void executeCommand() { command.execute(); } } ``` 现在可以测试上述代码,创建一个命令调用者并设置命令,然后执行命令: ```java public class Main { public static void main(String[] args) { Television tv = new Television(); Command openCommand = new OpenTVCommand(tv); Command closeCommand = new CloseTVCommand(tv); CommandInvoker invoker = new CommandInvoker(); invoker.setCommand(openCommand); invoker.executeCommand(); invoker.setCommand(closeCommand); invoker.executeCommand(); } } ``` 以上代码将打印出以下结果: ``` 打开电视 关闭电视 ``` 这说明命令模式成功将请求者与处理者解耦,并通过命令调用者来执行命令。

使用Python实现命令模式

命令模式是一种行为设计模式,其目的是将请求封装为对象,以便根据不同的请求进行参数化。通过将请求封装成一个对象,即可让用户使用不同的请求来参数化其他对象(例如日志记录、事务处理或队列等),并且支持可撤消的操作。 下面是一个使用Python实现命令模式的完整样例代码: ```python # 命令接口 class Command: def execute(self): pass # 命令实现类 class LightOnCommand(Command): def __init__(self, light): self.light = light def execute(self): self.light.on() class LightOffCommand(Command): def __init__(self, light): self.light = light def execute(self): self.light.off() # 命令的接收者 class Light: def on(self): print("灯打开了") def off(self): print("灯关闭了") # 命令调用者 class RemoteControl: def __init__(self): self.command = None def set_command(self, command): self.command = command def press_button(self): self.command.execute() # 测试代码 def main(): light = Light() light_on_command = LightOnCommand(light) light_off_command = LightOffCommand(light) remote_control = RemoteControl() remote_control.set_command(light_on_command) remote_control.press_button() # 打开灯 remote_control.set_command(light_off_command) remote_control.press_button() # 关闭灯 if __name__ == "__main__": main() ``` 在上述示例中, `Command` 接口定义了 `execute` 方法。具体的命令类 `LightOnCommand` 和 `LightOffCommand` 实现了 `Command` 接口,并将请求封装为对象。 `Light` 类作为命令的接收者,在 `LightOnCommand` 和 `LightOffCommand` 的 `execute` 方法中具体执行对应的操作。 `RemoteControl` 类作为命令调用者,通过 `set_command` 方法设置具体的命令,并使用 `press_button` 方法来执行命令。 通过这种方式,用户可以根据需要创建不同的命令实现类,并通过调用 `RemoteControl` 的方法来执行对应的命令。这样实现了请求的封装、参数化和可撤消操作的目标。