11/11

//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 on 2024-11-11 22:06  清荣峻茂  阅读(28)  评论(0)    收藏  举报