命令模式:将请求封装为对象( 二 )

macroCommand , 它包含了 add 和 execute 方法:【命令模式:将请求封装为对象】 public interface MacroCommand {
void add(Command command);
void execute();
}
 接下来,我们创建一个具体的宏命令类 TextEditorMacro , 它可以添加和执行多个子命令: public class TextEditorMacro implements MacroCommand {
private List<Command> commands = new ArrayList<>();
public void add(Command command) {
commands.add(command);
}
public void execute() {
for (Command command : commands) {
command.execute();
}
}
}
 然后,我们可以创建多个子命令 , 例如 OpenFileCommandEditFileCommand 和 SaveFileCommand,它们分别执行打开、编辑和保存文件的操作 。最后,我们可以使用宏命令将这些子命令组合成一个宏命令: public class Client {
public static void main(String[] args) {
OpenFileCommand openFile = new OpenFileCommand();
EditFileCommand editFile = new EditFileCommand();
SaveFileCommand saveFile = new SaveFileCommand();
TextEditorMacro macro = new TextEditorMacro();
macro.add(openFile);
macro.add(editFile);
macro.add(saveFile);
// 执行宏命令,依次执行子命令
macro.execute();
}
}
 这样,我们就实现了一个宏命令,可以一次性执行多个子命令,从而打开、编辑和保存文件 。撤销和重做命令模式还支持撤销和重做操作 。为了实现撤销,我们需要在命令对象中保存执行前的状态,并提供一个 undo 方法来恢复到之前的状态 。让我们通过一个简单的示例来演示撤销和重做 。假设我们有一个文本编辑器,可以执行添加文本、删除文本和撤销操作 。首先,我们定义一个命令接口 Command,包括了 execute 和 undo 方法: public interface Command {
void execute();
void undo();
}
 接下来,我们创建具体的命令类,例如 AddTextCommand 和 DeleteTextCommand,它们分别执行添加文本和删除文本的操作 , 并实现了 undo 方法来撤销操作 。 public class AddTextCommand implements Command {
private TextEditor textEditor;
private String addedText;
public AddTextCommand(TextEditor textEditor, String addedText) {
this.textEditor = textEditor;
this.addedText = addedText;
}
public void execute() {
textEditor.addText(addedText);
}
public void undo() {
textEditor.deleteText(addedText);
}
}
// 类似地实现 DeleteTextCommand
 然后,我们创建接收者类 TextEditor,它包含了实际的文本编辑逻辑,包括添加文本、删除文本和显示文本 。 public class TextEditor {
private StringBuilder text = new StringBuilder();
public void addText(String addedText) {
text.Append(addedText);
}
public void deleteText(String deletedText) {
int start = text.lastIndexOf(deletedText);
if (start != -1) {
text.delete(start, start + deletedText.length());
}
}
public void displayText() {
System.out.println(text.toString());
}
}
 最后,我们可以创建一个客户端来测试撤销和重做操作: public class Client {
public static void main(String[] args) {
TextEditor textEditor = new TextEditor();
Command addCommand1 = new AddTextCommand(textEditor, "Hello, ");
Command addCommand2 = new AddTextCommand(textEditor, "Design Patterns!");
Command deleteCommand = new DeleteTextCommand(textEditor, "Patterns!");
// 执行添加和删除操作
addCommand1.execute();
addCommand2.execute();
deleteCommand.execute();
// 显示当前文本
textEditor.displayText(); // 输出: Hello, Design!
// 撤销删除操作
deleteCommand.undo();
// 显示当前文本
textEditor.displayText(); // 输出: Hello, Design Patterns!
}
}
 通过上述代码,我们实现了撤销和重做操作,可以在执行操作后撤销到之前的状态 , 然后再重做 。这在需要保留操作历史的应用程序中非常有用 。总结命令模式是一种行为型设计模式,它将请求和操作解耦 , 允许将操作封装成独立的命令对象 。这使得我们能够实现撤销、重做、宏命令等高级功能,并且更容易扩展新的命令 。在设计软件系统时,考虑使用命令模式来提高代码的可维护性和灵活性 , 特别是需要支持撤销和重做功能的应用程序 。


推荐阅读