设计模式-命令模式示例

2023-05-04 15:12:22 浏览数 (1)

假设我们正在开发一个文本编辑器,需要支持撤销和重做操作。我们可以使用命令模式来实现这个功能。

首先定义命令接口:

代码语言: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!
    }
}

在这个示例中,我们使用命令模式来实现了文本编辑器的撤销和重做功能。通过将每个编辑操作封装成一个命令对象,我们可以很容易地实现撤销和重做功能,并且可以随时增加新的编辑操作,而不需要修改现有的代码。

0 人点赞