假设我们正在开发一个文本编辑器,需要支持撤销和重做操作。我们可以使用命令模式来实现这个功能。
首先定义命令接口:
代码语言:javascript复制public interface Command {
void execute();
void undo();
}
然后定义具体的命令类,比如“添加文本”命令:
代码语言:javascript复制public class AddTextCommand implements Command {
private final Receiver receiver;
private final String text;
public AddTextCommand(Receiver receiver, String text) {
this.receiver = receiver;
this.text = text;
}
@Override
public void execute() {
receiver.addText(text);
}
@Override
public void undo() {
receiver.deleteText(text);
}
}
接收者类是文本编辑器本身,其中包含了添加文本和删除文本的方法。
代码语言:javascript复制public class TextEditor implements Receiver {
private String text = "";
@Override
public void addText(String text) {
this.text = text;
}
@Override
public void deleteText(String text) {
if (this.text.endsWith(text)) {
this.text = this.text.substring(0, this.text.length() - text.length());
}
}
public String getText() {
return text;
}
}
调用者类是文本编辑器的用户界面,它包含了一个命令栈用于保存执行过的命令。
代码语言:javascript复制public class TextEditorUI {
private final TextEditor textEditor;
private final Stack<Command> commandStack = new Stack<>();
public TextEditorUI(TextEditor textEditor) {
this.textEditor = textEditor;
}
public void executeCommand(Command command) {
command.execute();
commandStack.push(command);
}
public void undo() {
if (!commandStack.isEmpty()) {
Command lastCommand = commandStack.pop();
lastCommand.undo();
}
}
public String getText() {
return textEditor.getText();
}
}
最后是客户端代码,它创建了一个文本编辑器和一个用户界面,并测试了撤销和重做操作。
代码语言:javascript复制public class Client {
public static void main(String[] args) {
TextEditor textEditor = new TextEditor();
TextEditorUI ui = new TextEditorUI(textEditor);
// 添加文本
Command addCommand1 = new AddTextCommand(textEditor, "Hello ");
ui.executeCommand(addCommand1);
System.out.println(ui.getText()); // Hello
// 添加文本
Command addCommand2 = new AddTextCommand(textEditor, "World!");
ui.executeCommand(addCommand2);
System.out.println(ui.getText()); // Hello World!
// 撤销
ui.undo();
System.out.println(ui.getText()); // Hello
// 撤销
ui.undo();
System.out.println(ui.getText()); //
// 重做
ui.redo();
System.out.println(ui.getText()); // Hello
// 重做
ui.redo();
System.out.println(ui.getText()); // Hello World!
}
}
在这个示例中,我们使用命令模式来实现了文本编辑器的撤销和重做功能。通过将每个编辑操作封装成一个命令对象,我们可以很容易地实现撤销和重做功能,并且可以随时增加新的编辑操作,而不需要修改现有的代码。