命令模式是一种行为设计模式,它允许将请求封装为一个对象,从而使不同的请求可以使用不同的参数进行参数化,队列或日志请求,以及支持可撤销的操作。 ,,在Windows系统中,进入命令模式的方法是按下Win+R键,输入cmd并按下回车键即可。
在计算机科学中,编程模式是一种可重用的解决方案,用于解决特定类型的问题,本文将重点讨论命令模式,这是一种行为型设计模式,它提供了一种将请求封装为一个对象的方法,从而使您可以使用不同的请求把客户端参数化,对请求排队或记录请求日志,以及支持可撤销的操作。
命令模式的主要目的是将请求的发送者和接收者解耦,使得两者可以独立地变化,在命令模式中,用户通过调用操作对象的execute()方法来执行命令,而不是直接调用接收者对象的方法,这样,当接收者对象需要改变时,只需要更改相应的操作对象即可,而不需要更改使用该接收者的所有客户端代码。
命令模式的主要角色有以下几个:
1、抽象命令(AbstractCommand):定义了执行命令所需的接口,包括一个execute()方法和一个undo()方法。
2、具体命令(ConcreteCommand):实现了抽象命令的execute()和undo()方法。
3、调用者(Invoker):负责调用具体命令的execute()方法。
4、接收者(Receiver):接收来自调用者的命令,并执行相应的操作。
下面我们来看一个简单的命令模式实现示例:
假设我们有一个打印机类Printer,它可以打印文本,现在我们想要实现一个撤销打印功能的命令模式。
我们需要定义一个抽象命令类PrintCommand:
public abstract class PrintCommand { protected Printer printer; protected String text; public PrintCommand(Printer printer, String text) { this.printer = printer; this.text = text; } public abstract void execute(); public abstract void undo(); }
我们需要定义一个具体命令类PrintTextCommand:
public class PrintTextCommand extends PrintCommand { public PrintTextCommand(Printer printer, String text) { super(printer, text); } @Override public void execute() { printer.print(text); } @Override public void undo() { printer.stop(); } }
我们需要定义一个接收者类Printer:
public class Printer { private boolean isRunning; public void print(String text) { // 实现打印功能的具体逻辑 } public void stop() { isRunning = false; } }
我们需要定义一个调用者类Invoker:
public class Invoker { private PrintCommand printCommand; public void setPrintCommand(PrintCommand printCommand) { this.printCommand = printCommand; } public void invoke() throws Exception { printCommand.execute(); } }
现在我们可以在客户端代码中使用命令模式来实现撤销打印功能:
public class Client { public static void main(String[] args) throws Exception { Printer printer = new Printer(); Invoker invoker = new Invoker(); PrintTextCommand printTextCommand = new PrintTextCommand(printer, "Hello, World!"); invoker.setPrintCommand(printTextCommand); // 将打印命令设置到调用者中 invoker.invoke(); // 通过调用者执行打印命令,此时会触发具体的打印操作和停止操作的执行;如果需要撤销操作,只需再次调用invoker.invoke()即可。