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