11.28

[实验任务一]:多次撤销和重复的命令模式
某系统需要提供一个命令集合(注:可以使用链表,栈等集合对象实现),用于存储一系列命令对象,并通过该命令集合实现多次undo()和redo()操作,可以使用加法运算来模拟实现。
实验要求:

  1. 提交类图;

  2. 提交源代码;


// AbstractCommand.java
package command;

public abstract class AbstractCommand {
    public abstract int execute(int value);
    public abstract int undo();
    public abstract int redo();
}

// Adder.java
package command;

public class Adder {
    private int num = 0;
    
    public int add(int value) {
        num += value;
        return num;
    }
}

// AddCommand.java
package command;

import java.util.Stack;

public class AddCommand extends AbstractCommand {
    private Adder adder;
    private Stack<Integer> unStack;
    private Stack<Integer> reStack;
    
    public AddCommand(Adder adder) {
        this.adder = adder;
        this.unStack = new Stack<>();
        this.reStack = new Stack<>();
    }
    
    @Override
    public int execute(int value) {
        int result = adder.add(value);
        unStack.push(value);
        reStack.clear(); // 执行新命令时清空重做栈
        return result;
    }
    
    @Override
    public int undo() {
        if (unStack.isEmpty()) {
            return 0; // 没有可撤销的操作
        }
        
        int value = unStack.pop();
        reStack.push(value);
        return adder.add(-value); // 撤销就是执行相反的操作
    }
    
    @Override
    public int redo() {
        if (reStack.isEmpty()) {
            return 0; // 没有可重做的操作
        }
        
        int value = reStack.pop();
        unStack.push(value);
        return adder.add(value);
    }
}

// CalculatorForm.java
package command;

public class CalculatorForm {
    private AbstractCommand command;
    
    public CalculatorForm(AbstractCommand command) {
        this.command = command;
    }
    
    public void compute(int value) {
        int result = command.execute(value);
        System.out.println("计算结果: " + result);
    }
    
    public void undo() {
        int result = command.undo();
        System.out.println("撤销后结果: " + result);
    }
    
    public void redo() {
        int result = command.redo();
        System.out.println("重做后结果: " + result);
    }
}

// Main.java
package command;

public class Main {
    public static void main(String[] args) {
        // 创建接收者
        Adder adder = new Adder();
        
        // 创建命令
        AddCommand addCommand = new AddCommand(adder);
        
        // 创建调用者
        CalculatorForm calculator = new CalculatorForm(addCommand);
        
        // 测试计算、撤销和重做功能
        calculator.compute(5);    // 加5
        calculator.compute(3);    // 加3
        calculator.compute(2);    // 加2
        
        calculator.undo();        // 撤销加2
        calculator.undo();        // 撤销加3
        
        calculator.redo();        // 重做加3
        calculator.compute(4);    // 加4
    }
}

  1. 注意编程规范。
posted @   aallofitisst  阅读(5)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示