命令模式--Java实现

相关类图

具体代码

//Invoker.java
package org.example.test015;

public class Invoker {
    public void setCommand(Command command) {
        this.command = command;
    }

    private Command command;

    public void addIt(int value) {
        command.execute(value);
    }

    public void undo() {
        int i = command.undo();

        if (i == -1) {
            System.out.println("已经撤销到初态");
        }
        else {
            System.out.println("执行成功!运算结果是 " + i);
        }
    }

    public void redo() {
        int i = command.redo();

        if (i == -1) {
            System.out.println("已经恢复到终态");
        }
        else {
            System.out.println("执行成功!运算结果是 " + i);
        }
    }

}

//AbstractCommand.java
package org.example.test015;

public abstract class AbstractCommand {

    public abstract int execute(int value);
    public abstract int undo();
    public abstract int redo();
}

//AddCommand.java
package org.example.test015;

import java.util.Stack;

public class AddCommand extends AbstractCommand {
    private Addition addition = new Addition();
    private Stack<Integer> unStack = new Stack<Integer>();
    private Stack<Integer> reStack = new Stack<Integer>();

    @Override
        public int execute(int value) {//计算操作
        int result = 0;
        result = addition.addOperate(value);
        System.out.println(result);
        unStack.push(result);
        return result;
    }

    @Override
        public int undo() {//撤回操作
        int i = 0;
        if (unStack.isEmpty()) {//栈为空
            i = -1;
        }
        else {//栈不空,栈元素弹出
            int x = unStack.pop();
            reStack.push(x);//放入恢复栈中,便于之后的操作
            if (!unStack.isEmpty()) {
                i = unStack.peek();
            }
        }
        return i;
    }

    @Override
        public int redo() {//恢复操作
        int i = 0;
        if (reStack.isEmpty()) {
            i = -1;
        }
        else {
            int x = reStack.pop();
            unStack.push(x);
            i = x;
        }
        return i;
    }
}

//Addition.java
package org.example.test015;

public class Addition {
    private int sum = 0;

    public int addOperate(int value) {
        sum += value;
        return sum;
    }
}

//Client.java
package org.example.test015;

public class Client {
    public static void main(String[] args) {
        Invoker invoker = new Invoker();
        AbstractCommand command = new AddCommand();
        invoker.setCommand(command);

        System.out.println("计算过程:");
        invoker.addIt(2);
        invoker.addIt(3);
        invoker.addIt(4);

        System.out.println("撤回操作:");
        invoker.undo();
        invoker.undo();
        invoker.undo();
        invoker.undo();

        System.out.println("恢复操作:");
        invoker.redo();
        invoker.redo();
        invoker.redo();
        invoker.redo();
    }
}

运行结果

posted @ 2023-11-20 10:20  yesyes1  阅读(5)  评论(0编辑  收藏  举报