2009-03-31 13 views

답변

92

데이터 구조가 아니라 디자인 패턴입니다. Command Pattern을 찾고 있습니다.

표준은 다단계 실행 취소를 지원하기 위해 스택에 Command 개체를 유지하는 것입니다. 재실행을 지원하기 위해 두 번째 스택은 실행 취소 한 모든 명령을 유지합니다. 따라서 명령을 실행 취소하기 위해 실행 취소 스택을 팝하면 재실행 스택에 넣은 명령과 동일한 명령을 누르게됩니다. 명령을 다시 실행할 때 역순으로 동일한 작업을 수행합니다. 다시 실행 스택을 팝하고 실행 된 스택으로 실행 된 명령을 다시 푸시합니다.

+28

또 다른 명령을 푸시하면 항상 다시 실행 스택을 지우는 것이 중요합니다. – Balk

+10

데이터 구조는 "Command"개체의 인스턴스가있는 스택입니다. – zinovii

+1

명령 패턴이 반드시 실행 취소 방법을 구현하는 것과 같지 않은 것처럼 느껴진다. 단지 하나의 옵션 일 뿐이며 OP 질문에 대한 대답도 아니다. 실행 취소/다시 실행 스택이 답입니다. (비록 그가 MSWord에 대해 언급했다고 가정 하긴하지만) –

2

Objective-C 코코아에는 잘 문서화 된 NSUndoManager이라는 anwser가 있습니다.

당신은 실행 취소/

확인이 샘플을 다시 실행 실현하려 명령 패턴을 사용할 수 있습니다

31

,이 기능에 대한 표준 패턴 (갱, 심지어)은 Memento입니다. 대부분의 프로그램은 실행 취소/스택을 다시 실행 사용하는 동안

또한, 특정 텍스트 편집기의 afficionados들이 몇 가지 명령을 취소 할 경우 그들의 전체 역사를 잃지 않도록 실행 취소/나무를 다시 실행 선호, 새로운 것을 시도하고, 마음을 바꿔라.

+3

네 말이 맞아. 명령 패턴과 상호 작용하는 방법에 대한 정보를 추가하면 큰 도움이됩니다. – Kieveli

+0

Memento의 사용을 취소하려고합니다. Memento가 undo/redo에 대한 작업 전후의 오브젝트 상태를 저장하는 데 사용됩니까? – NileshChauhan

+1

메멘토를 생성하는 객체는 그것을 사용하여 그 상태로 돌아갑니다. 메멘토 자체는 마치 불투명 한 것으로 취급되어야합니다. 전체 상태를 메멘토에 집어 넣는 것은 명백한 구현 선택처럼 보이지만, 백엔드 저장소 나 다른 곳으로의 diff 나 id와 같은 것일 수도 있습니다. –

0

이것은 Command Pattern의 전형적인 경우입니다. 다음은 Python에서 실행 취소 기능의 샘플 구현입니다.

from os import rename 
class RenameFileCommand(object): 
    def __init__(self, src_file, target_file): 
     self.src_file=src_file 
     self.target_file=target_file 


    def execute(self): 
     rename(self.src_file, self.target_file) 

    def undo(self): 
     rename(self.target_file,self.src_file) 



class History(object): 
    def __init__(self): 
     self.commands=list() 
    def execute(self, command): 
     command.execute() 
     self.commands.append(command) 

    def undo(self): 
     self.commands.pop().undo() 


if __name__=='__main__': 
    hist=History() 
    hist.execute(RenameFileCommand('test1.txt', 'tmp.txt',)) 
    hist.undo() 
    hist.execute(RenameFileCommand('tmp2.txt', 'test2.txt',)) 
관련 문제