实验16:命令模式

本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 

1、理解命令模式的动机,掌握该模式的结构;

2、能够利用命令模式解决实际问题。

 

[实验任务一]:多次撤销和重复的命令模式

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

实验要求:

1. 提交类图;

2. 提交源代码;

3. 注意编程规范。

1类图

 

源代码

package org.example;

import java.util.Stack;
public abstract class AbstractCommand {
    public abstract int execute(int value);
    public abstract int undo();
    public abstract int redo();
}

package org.example;

// 具体的加法命令
public class AddCommand implements Command {
    private int value;
    private Calculator calculator;

    public AddCommand(Calculator calculator, int value) {
        this.calculator = calculator;
        this.value = value;
    }

    @Override
    public void execute() {
        calculator.add(value);
    }

    @Override
    public void undo() {
        calculator.add(-value); // 撤销操作,执行反向加法
    }
}

package org.example;

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

package org.example;

// 计算器类
public class Calculator {
    private int total = 0;

    public void add(int value) {
        total += value;
    }

    public int getTotal() {
        return total;
    }
}

package org.example;

import java.util.Stack;

public class CalculatorForm {
    private Command currentCommand;
    private Stack<Command> undoStack = new Stack<>();
    private Stack<Command> redoStack = new Stack<>();
    private Calculator calculator = new Calculator();

    // 设置当前命令
    public void setCommand(Command command) {
        this.currentCommand = command;
    }

    // 执行计算
    public void compute(int value) {
        AddCommand command = new AddCommand(calculator, value);
        command.execute();  // 执行加法
        System.out.println("计算结果: " + calculator.getTotal());
        undoStack.push(command);  // 将命令添加到撤销栈
        redoStack.clear();  // 清空重做栈
    }

    // 撤销操作
    public void undo() {
        if (!undoStack.isEmpty()) {
            Command command = undoStack.pop();
            command.undo();  // 执行撤销操作
            redoStack.push(command);  // 将命令推到重做栈
            System.out.println("撤销后结果: " + calculator.getTotal());
        } else {
            System.out.println("没有可以撤销的操作!");
        }
    }

    // 恢复操作
    public void redo() {
        if (!redoStack.isEmpty()) {
            Command command = redoStack.pop();
            command.execute();  // 执行重做操作
            undoStack.push(command);  // 将命令推到撤销栈
            System.out.println("恢复后结果: " + calculator.getTotal());
        } else {
            System.out.println("没有可以重做的操作!");
        }
    }
}

package org.example;

public class Client {
    public static void main(String[] args) {
        CalculatorForm form = new CalculatorForm();

        // 进行计算
        System.out.println("------计算过程------");
        form.compute(1); // 结果: 1
        form.compute(2); // 结果: 3
        form.compute(3); // 结果: 6
        form.compute(4); // 结果: 10

        // 多次撤回
        System.out.println("------撤回过程------");
        form.undo(); // 结果: 6
        form.undo(); // 结果: 3
        form.undo(); // 结果: 1
        form.undo(); // 结果: 0
        form.undo(); // 没有可以撤销的操作

        // 多次恢复
        System.out.println("------恢复过程------");
        form.redo(); // 结果: 1
        form.redo(); // 结果: 3
        form.redo(); // 结果: 6
        form.redo(); // 结果: 10
        form.redo(); // 没有可以重做的操作
    }
}

package org.example;

// 命令接口
public interface Command {
    void execute();
    void undo();
}

 

3、运行截图

 

 

posted @ 2024-11-13 09:15  不会JAVA的小袁  阅读(8)  评论(0编辑  收藏  举报