TL : 명령 및 메멘토 패턴 (Design Patterns - Gama et. al)을 구현하여 실행 취소 및 다시 실행 작업을 지원할 수 있습니다.
메멘토 패턴
이 간단한 패턴은 객체의 상태를 저장할 수 있습니다. 새 클래스에 객체를 간단히 감싸고 상태가 변경 될 때마다 객체를 업데이트하십시오.
public class Memento
{
MyObject myObject;
public MyObject getState()
{
return myObject;
}
public void setState(MyObject myObject)
{
this.myObject = myObject;
}
}
명령 패턴
명령 패턴은 우리가 실행 취소의 경우에 필요한 유품 객체 (우리는 실행 취소/다시 실행을 지원하려는) 원의 객체를 저장합니다.
- 는 실행 : 또한, 2 가지 방법은 정의 된 명령어
- unExecute을 실행한다 : 명령을 제거
번호 :
public abstract class Command
{
MyObject myObject;
Memento memento;
public abstract void execute();
public abstract void unExecute();
}
은 "논리적 정의 명령 (예 : 삽입)을 확장하는 "동작":
public class InsertCharacterCommand extends Command
{
//members..
public InsertCharacterCommand()
{
//instantiate
}
@Override public void execute()
{
//create Memento before executing
//set new state
}
@Override public void unExecute()
{
this.myObject = memento.getState()l
}
}
적용 패턴 :
이 마지막 단계는 실행 취소/다시 실행 동작을 정의합니다. 핵심 아이디어는 명령의 히스토리 목록으로 작동하는 명령 스택을 저장하는 것입니다. 다시 실행을 지원하기 위해 실행 취소 명령이 적용될 때마다 보조 포인터를 유지할 수 있습니다. 새 객체가 삽입 될 때마다 현재 위치 이후의 모든 명령이 제거됩니다. 그는 deleteElementsAfterPointer
방법에 의해 달성있어 아래 정의 :
private int undoRedoPointer = -1;
private Stack<Command> commandStack = new Stack<>();
private void insertCommand()
{
deleteElementsAfterPointer(undoRedoPointer);
Command command =
new InsertCharacterCommand();
command.execute();
commandStack.push(command);
undoRedoPointer++;
}
private void deleteElementsAfterPointer(int undoRedoPointer)
{
if(commandStack.size()<1)return;
for(int i = commandStack.size()-1; i > undoRedoPointer; i--)
{
commandStack.remove(i);
}
}
private void undo()
{
Command command = commandStack.get(undoRedoPointer);
command.unExecute();
undoRedoPointer--;
}
private void redo()
{
if(undoRedoPointer == commandStack.size() - 1)
return;
undoRedoPointer++;
Command command = commandStack.get(undoRedoPointer);
command.execute();
}
결론 :이 디자인은 강력하게 만드는 무엇
당신이 원하는대로합니다 (Command
클래스를 확장하여) 많은 명령을 추가 할 수 있다는 사실이다 예를 들어, , RemoveCommand
, UpdateCommand
등등. 또한 동일한 패턴을 모든 유형의 객체에 적용 할 수 있으므로 재사용 가능 및 은 서로 다른 사용 사례에 따라으로 수정 가능합니다.
내장 된 실행 취소 지원을 확인하십시오. 나는 그것을 사용한 적이 없으며 Swing 튜토리얼을 찾을 수는 없지만 [여기] (http://docs.oracle.com/javase/6/docs/api/javax/swing/undo/UndoManager.html)) 매니저입니다. –