2023/10/21 每日总结

今天完成了设计模式实验16

实验16:命令模式

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

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

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

 

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

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

类图

 

源代码

package org.test16;

public class AddCommand implements Command{
    private Receiver receiver;
    private int value;

    public AddCommand(Receiver receiver, int value) {
        this.receiver = receiver;
        this.value = value;
    }

    @Override
    public void execute() {
        receiver.addValue(value);
    }

    @Override
    public void undo() {
        receiver.subtractValue(value);
    }
}



package org.test16;

import java.util.LinkedList;
import java.util.List;
import java.util.Stack;

public class CareTaker {
    private List<Stack<Command>> history = new LinkedList<>();

    public void saveState(Stack<Command> state) {
        history.add(state);
    }

    public Stack<Command> getState(int index) {
        return history.get(index);
    }

}




package org.test16;

public class Client {
    public static void main(String[] args) {
        Receiver receiver = new Receiver();
        Invoker invoker = new Invoker();


        // 执行一系列加法操作
        invoker.executeCommand(new AddCommand(receiver, 5));
        invoker.executeCommand(new AddCommand(receiver, 10));
        invoker.executeCommand(new AddCommand(receiver, 8));

        // 保存当前状态
        //careTaker.saveState(invoker.getRedoStack());

        // 撤销一次
        invoker.undo();

        // 保存当前状态
        //careTaker.saveState(invoker.getUndoStack());

        // 重做一次
        invoker.redo();

        // 撤销一次
        invoker.undo();
    }
}




package org.test16;

public interface Command {
    void execute();
    void undo();
}



package org.test16;

import java.util.Stack;

public class Invoker {
    private Stack<Command> undoStack = new Stack<>();
    private Stack<Command> redoStack = new Stack<>();

    public void executeCommand(Command command) {
        command.execute();
        undoStack.push(command);
        redoStack.clear();
    }

    public void undo() {
        if (!undoStack.isEmpty()) {
            Command command = undoStack.pop();
            command.undo();
            redoStack.push(command);
        } else {
            System.out.println("Nothing to undo.");
        }
    }
    public Stack<Command> getUndoStack() {
        return undoStack;
    }
    public Stack<Command> getRedoStack() {
        return redoStack;
    }

    public void redo() {
        if (!redoStack.isEmpty()) {
            Command command = redoStack.pop();
            command.execute();
            undoStack.push(command);
        } else {
            System.out.println("Nothing to redo.");
        }
    }
}




package org.test16;

public class Receiver {
    private int value = 0;

    public void addValue(int amount) {
        value += amount;
        System.out.println("Value after addition: " + value);
    }

    public void subtractValue(int amount) {
        value -= amount;
        System.out.println("Value after subtraction: " + value);
    }

    public int getValue() {
        return value;
    }

}

 

posted @ 2023-10-21 23:46  樱花开到我身边  阅读(7)  评论(0)    收藏  举报