做网站互联网公司排名,软件工程师的发展前景,网站后台上传图片步骤,厦门网站建设ui设计模式浅析(六) 命令模式
日常叨逼叨
java设计模式浅析#xff0c;如果觉得对你有帮助#xff0c;记得一键三连#xff0c;谢谢各位观众老爷#x1f601;#x1f601; 命令模式
概念
命令模式#xff08;Command Pattern#xff09;是一种行为设计模式#xff0c…设计模式浅析(六) ·命令模式
日常叨逼叨
java设计模式浅析如果觉得对你有帮助记得一键三连谢谢各位观众老爷 命令模式
概念
命令模式Command Pattern是一种行为设计模式它允许将请求封装为一个对象从而使你可以使用不同的请求将客户端与接收者解耦。命令模式也支持可撤销操作。
命令模式结构
命令模式Command Pattern的结构包含以下四个主要角色
Command命令接口 定义了一个用于执行请求的接口。命令对象通常会持有接收者对象并在调用时执行其上的操作。 ConcreteCommand具体命令类 实现了命令接口通常会持有一个接收者对象并定义了一个execute方法来执行请求。具体命令类知道如何执行与接收者相关联的动作通常动作实现在接收者对象中但命令对象决定了何时执行动作。 Receiver接收者 知道如何执行与命令相关联的具体操作。任何类都可能成为接收者只要它能实现执行请求所需的操作。 Invoker调用者 也称为请求者它负责调用命令对象来执行请求。调用者并不直接知道接收者的存在也不直接与接收者交互。它通过命令对象来间接调用接收者。 Client客户端 创建具体命令对象并设置给调用者。客户端负责组装命令对象但并不直接调用接收者。
命令模式类图 示例
我们将模拟使用命令模式实现一个电视开关机Demo。电视遥控器操作有许多种Demo实现电视的开机和关机两种操作使用命令模式完成方便后续其他操作模式的拓展。
根据上述命令模式的结构首先创建一个命令接口在抽象命令中具有一个execute()方法待会的具体命令将实现这个execute()方法。
//抽象命令接口
public interface Command {//命令执行void execute() throws InterruptedException;}接着我们需要定义一个命令的接收者即负责处理命令的具体逻辑操作。在这个类中我们定义了两种操作的方法分别是on()和off()。在两个方法中分别输出打开和关闭
public class TVCommandReceiver {public void on() throws InterruptedException {System.out.println(turn on tv);Thread.sleep(2000);System.out.println(now tv is on);}public void off() throws InterruptedException {System.out.println(turn off tv );Thread.sleep(2000);System.out.println(now tv is off);}
}然后实现具体的命令CommandOn类实现了Command命令的execute()方法并且管理了一个命令接收者实例方便调用者Invoker进行调用
public class CommandOn implements Command{TVCommandReceiver tvCommandReceiver;public CommandOn(TVCommandReceiver tvCommandReceiver) {this.tvCommandReceiver tvCommandReceiver;}Overridepublic void execute() throws InterruptedException {tvCommandReceiver.on();}}CommandOff与CommandOn相类似
public class CommandOff implements Command{TVCommandReceiver tvCommandReceiver;public CommandOff(TVCommandReceiver tvCommandReceiver) {this.tvCommandReceiver tvCommandReceiver;}Overridepublic void execute() throws InterruptedException {tvCommandReceiver.off();}}最后我们要实现一个命令的调用者即Invoker类该类中含有添加命令和命令执行的具体逻辑。并管理了一个命令列表方便记录历史。
在Invoker类中我们实现了三个方法分别是putCommand()、runCommand()和cancelCommand()。putCommand()方法会将所有命令加入到命令列表中。而runCommand()方法将遍历所有命令负责执行具体命令cancelCommand()用于执行时取消某个命令。
public class Invoker {private ListCommand commandList new ArrayList();/**** 添加命令* param command*/public void putCommand(Command command) {commandList.add(command);}/**** 执行命令* throws InterruptedException*/public void runCommand() throws InterruptedException {if (commandList.size() 0) {System.out.println(no command input);}for (Command command : commandList) {command.execute();}commandList.clear();}/**** 取消命令* param command*/public void cancelCommand(Command command) {if (commandList.size() 0) {System.out.println(no command input);}int index commandList.indexOf(command);if (index -1) {System.out.println(no such command find );} else {commandList.remove(index);System.out.println(command command has been canceled);}}
}至此尝试创建Client进行测试
public class Client {public static void main(String[] args) throws InterruptedException {//注册命令接收者TVCommandReceiver receiver new TVCommandReceiver();//注册命令CommandOn tvOnCommand new CommandOn(receiver);CommandOff tvOffCommand new CommandOff(receiver);//添加命令Invoker invoker new Invoker();invoker.putCommand(tvOnCommand);invoker.putCommand(tvOffCommand);//取消命令invoker.cancelCommand(tvOffCommand);//命令执行invoker.runCommand();}
}执行结果 command com.jerry.commandPattern.CommandOff1b6d3586has been canceled turn on tv now tv is on Process finished with exit code 0 至此我们实现了简单的命令模式案例
优缺点
优点
降低耦合度命令模式可以将请求者与接收者解耦调用者只需要知道如何调用命令而不需要知道命令的具体实现细节。扩展性良好增加或删除命令非常方便满足“开闭原则”。由于增加新的命令类不会影响到其他类因此系统具有良好的扩展性。支持宏命令命令模式可以与组合模式结合将多个命令装配成一个组合命令宏命令从而可以一次性执行多个操作。支持撤销和重做命令模式可以与备忘录模式结合实现命令的撤销与恢复操作方便实现撤销Undo和重做Redo功能。
缺点
命令类过多如果系统中有大量的命令那么就需要创建大量的命令类这可能会导致系统结构变得复杂增加理解和维护的难度。可能导致性能问题如果命令的执行过程比较复杂那么频繁地创建和销毁命令对象可能会对系统的性能产生负面影响。客户端代码可能变得复杂如果客户端需要创建和管理大量的命令对象那么客户端代码可能会变得复杂和难以维护。 代码相关代码可以参考 代码仓库
ps本文原创转载请注明出处