java undo_Java中undo功能实现

在很多游戏和应用程序中经常会用到回退功能,相当于ctrl+z。下面是使用Java实现undo功能

具体代码如下:

import java.lang.reflect.Method;

import java.util.LinkedList;

import java.util.List;

public class Undo {

private LinkedList primaryList = new LinkedList();

//快照列表

private LinkedList snapshotList = new LinkedList();

//上一次操作调用的方法

private Method lastOperation;

//上一次操作调用的方法参数

private Object[] lastOperationArgs;

//拍快照,每操作一次拍下快照

private void takeSnapshot() {

List snapshot = new LinkedList();

for (T element : primaryList) {

snapshot.add(element);

}

snapshotList.add(snapshot);

}

//从最新的快照恢复

private void restoreFromSnapshot() {

//pollLast()获取并移除此列表的最后一个元素;如果此列表为空,则返回 null。

List snapshot = snapshotList.pollLast();

primaryList.clear();

for (T element : snapshot) {

primaryList.add(element);

}

}

//设置上次操作

private void setLastInvokedOperation(String methodName, Object... params) {

try {

this.lastOperation = this.getClass().

getMethod(methodName, this.getParamTypes(params));

} catch (Exception e) {

if (setLastMethodParamsGeneric(methodName, params)==false){

e.printStackTrace();

}

}

this.lastOperationArgs = params;

}

//设置上一个方法的参数

private boolean setLastMethodParamsGeneric(String methodName, Object... params) {

Method[] methods = this.getClass().getMethods();

for (int i=0; i

if (this.isMethodMatch(methods[i], methodName, params)) {

this.lastOperation = methods[i];

return true;

}

}

return false;

}

//判断方法是否匹配

private boolean isMethodMatch(Method method, String methodName, Object... params){

if (!method.getName().equalsIgnoreCase(methodName)) {

return false;

}

Class>[] paramTypes = method.getParameterTypes();

if (paramTypes.length != params.length) {

return false;

}

for (int i=0; i

if (!paramTypes[i].isAssignableFrom(params[i].getClass())) {

return false;

}

}

return true;

}

//获取参数的类型

private Class>[] getParamTypes(Object... params) {

Class>[] paramTypes = new Class>[params.length];

for (int i=0; i

paramTypes[i] = params[i].getClass();

}

return paramTypes;

}

//执行上一个方法

private void invokeLastMethod() {

try {

this.lastOperation.invoke(this, this.lastOperationArgs);

} catch (Exception e) {

e.printStackTrace();

}

}

//删除操作

public void delete(Integer beginIndex, Integer endIndex) {

//删除操作之前拍下快照

this.takeSnapshot();

for (int i=beginIndex; i<=endIndex; i++) {

primaryList.remove(beginIndex);

}

this.setLastInvokedOperation("delete", beginIndex, endIndex);

}

//插入操作

public void insert(T element, Integer index) {

//插入操作之前拍下快照

this.takeSnapshot();

primaryList.add(index, element);

this.setLastInvokedOperation("insert", element, index);

}

//修改操作

public void modify(T element, Integer index) {

//修改操作之前拍下快照

this.takeSnapshot();

primaryList.set(index, element);

this.setLastInvokedOperation("modify", element, index);

}

//重做,取消复原

public void redo() {

//执行上次操作的方法

this.invokeLastMethod();

}

//撤销

public void undo() {

//重最新的快照中恢复

this.restoreFromSnapshot();

}

public String toString() {

return this.primaryList.toString();

}

public static void main(String[] args) {

Undo ell = new Undo();

ell.insert("hey", 0);

System.out.println(ell);

ell.redo();

System.out.println(ell);

ell.undo();

System.out.println(ell);

ell.redo();

System.out.println(ell);

ell.undo();

System.out.println(ell);

ell.undo();

System.out.println(ell);

}

}

ok,问题解决。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`undo()` 方法是用于撤销上一次操作的方法,通常用于实现“撤销”功能。在 Java 实现撤销功能的方式有很多种,这里提供一种常见的方式: 1. 定义一个接口 `Command`,该接口包含两个方法:`execute()` 和 `undo()`。 ```java public interface Command { void execute(); void undo(); } ``` 2. 实现具体的操作类,这些类实现 `Command` 接口,并实现 `execute()` 和 `undo()` 方法。 ```java public class AddCommand implements Command { private final List<Integer> list; private final int num; public AddCommand(List<Integer> list, int num) { this.list = list; this.num = num; } @Override public void execute() { list.add(num); } @Override public void undo() { list.remove(list.size() - 1); } } public class RemoveCommand implements Command { private final List<Integer> list; private final int index; private int num; public RemoveCommand(List<Integer> list, int index) { this.list = list; this.index = index; } @Override public void execute() { num = list.remove(index); } @Override public void undo() { list.add(index, num); } } ``` 3. 创建一个 `CommandManager` 类,用于管理所有的操作。 ```java public class CommandManager { private final List<Command> commands = new ArrayList<>(); private int currentIndex = -1; public void executeCommand(Command command) { command.execute(); currentIndex++; if (currentIndex < commands.size()) { commands.subList(currentIndex, commands.size()).clear(); } commands.add(command); } public boolean canUndo() { return currentIndex >= 0; } public void undo() { if (canUndo()) { Command command = commands.get(currentIndex); command.undo(); currentIndex--; } } } ``` 4. 使用 `CommandManager` 类实现撤销功能。 ```java public static void main(String[] args) { List<Integer> list = new ArrayList<>(); CommandManager manager = new CommandManager(); manager.executeCommand(new AddCommand(list, 1)); manager.executeCommand(new AddCommand(list, 2)); manager.executeCommand(new AddCommand(list, 3)); System.out.println(list); // [1, 2, 3] if (manager.canUndo()) { manager.undo(); } System.out.println(list); // [1, 2] } ``` 在上面的代码,我们首先创建了一个 `CommandManager` 对象 `manager`,然后依次执行了三个操作:添加数字 1、2、3。执行完操作后,我们输出了列表 `list` 的内容,可以看到列表包含了数字 1、2、3。 接着,我们判断 `manager` 是否可以执行撤销操作,如果可以,就执行一次撤销操作。然后再次输出列表 `list` 的内容,可以看到列表只剩下了数字 1、2,数字 3 已经被撤销了。 以上就是一种实现 Java 撤销功能的方式。当然,具体实现方式可能因应用场景而异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值