命令设计模式
创始人
2024-06-03 06:44:39
0

介绍

Java命令模式(Command Pattern)是一种行为型设计模式,它将请求封装成一个对象,从而使不同的请求可以进行参数化,并支持请求的排队,记录日志,撤销操作等.

在命令模式中,将命令请求者(Invoker),命令接收者(Receiver)和命令对象(Command)进行了解耦,使得它们可以独立地变化.具体的说,命令对象封装了一个特定的请求和其对应的操作,Invoker对象负责调用命令来执行请求,而Receiver对象则负责实际执行命令所代表的操作.

在Java中,可以通过定义一个接口来定义命令对象的基本行为,然后再定义具体的命令对象实现该接口.Invoker对象可以包含一个或多个命令对象,可以通过调用命令对象的execute()方法来执行相应的命令.而Receiver对象则负责实际执行命令所代表的操作,其具体实现可以再命令对象的execute()方法中调用.

实现

命令对象接口

public interface Command {/*** 执行*/void execute();/*** 撤销*/void undo();
}

具体命令对象

public class ConcreteCommand1 implements Command {private Receiver receiver;private boolean isExecute;public ConcreteCommand1(Receiver receiver) {this.receiver = receiver;}/*** 执行*/@Overridepublic void execute() {receiver.action1();isExecute = true;}/*** 撤销*/@Overridepublic void undo() {if (isExecute) {receiver.undoAction1();isExecute = false;}}
}public class ConcreteCommand2 implements Command {private Receiver receiver;private boolean isExecute;public ConcreteCommand2(Receiver receiver) {this.receiver = receiver;}/*** 执行*/@Overridepublic void execute() {receiver.action2();isExecute = true;}/*** 撤销*/@Overridepublic void undo() {if (isExecute) {receiver.undoAction2();isExecute = false;}}
}

命令接收者

public class Receiver {public void action1() {System.out.println("Receiver.action1() 被调用...");}public void action2() {System.out.println("Receiver.action2() 被调用...");}public void undoAction1(){System.out.println("Receiver.undoAction1() 被调用...");}public void undoAction2(){System.out.println("Receiver.undoAction2() 被调用...");}
}

命令请求者

public class Invoker {private List commandList = new ArrayList<>();/*** 添加命令** @param command*/public void addCommand(Command command) {commandList.add(command);}/*** 执行命令*/public void executeCommands() {commandList.forEach(Command::execute);}/*** 撤销命令*/public void undoCommands() {for (int i = commandList.size() - 1; i >= 0; i--) {commandList.get(i).undo();}}
}

测试

public class Demo {public static void main(String[] args) {Receiver receiver = new Receiver();Command command1 = new ConcreteCommand1(receiver);Command command2 = new ConcreteCommand2(receiver);Invoker invoker  = new Invoker();invoker.addCommand(command1);invoker.addCommand(command2);invoker.executeCommands();invoker.undoCommands();}
}

在这里插入图片描述

再示例代码中,定义了两个具体的命令对象实现,分别是ConcreteCommand1和ConcreteCommand2,它们都实现了Command接口,并且支持撤销操作.每个ConcreteCommand对象内部维护了一个boolean类型的isExecute变量,表示该命令是否已经执行过.如果execute()方法中,执行具体的命令操作,并将isExecute设为true.再undo()方法中,如果该命令已经执行过,则执行与execute()方法相反的操作,并将isExecute设为false.Receiver类是命令接收者,它实际执行命令所代表的操作.Invoker类中包含了一个Command对象列表,它通过addCommand()方法向其中添加具体的Command对象,executeCommand()用于执行所有添加的Command对象,而undoCommands()方法则用于撤销所有添加的Command对象,执行与撤销的顺序正好相反.

总结

优点

  • 解耦合,命令模式可以将命令请求者和命令接收者之间解耦合,使得它们之间不直接产生相互作用,从而提高系统的灵活性和可扩展性
  • 扩展性,由于命令模式将请求封装成对象,因此可以方便地新增或修改命令,而不影响其他对象的运行.同时,也可以方便地新增或修改命令接收者,从而实现系统功能的灵活变化.
  • 撤销操作,命令模式可以支持撤销操作,使得系统具有回滚功能,增强了系统的容错性.

缺点

  • 系统复杂性,使用命令模式需要增加额外的类和接口,从而增加了系统的复杂性
  • 性能损失.由于需要将请求封装成对象,因此可能会导致系统性能的降低,特别是再处理大量请求时

应用场景

  • 撤销操作,如果系统需要支持撤销操作,那么命令模式是一个非常好的选择.例如:文本编辑器中的"撤销"和"重做"操作.
  • 日志记录,命令模式可以用来记录请求日志,从而实现系统的日志功能.例如:使用命令模式记录用户的操作记录,实现系统的审计功能.
  • 队列请求.如果需要将请求排队,可以使用命令模式来管理请求队列.例如:使用命令模式管理操作系统的I/O请求队列.

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...