2010-12-13 4 views
8

내 응용 프로그램에서 사용자에게 작은 실행 취소 기능을 제공하려고합니다. 사용자가 취소 할 수있는 것보다 많은 조치가 없습니다. 특히 작업은 다음과 같습니다실행 취소 기능을 구현하는 방법은 무엇입니까?

지금 내가 이것을 구현하는 방법에 대해 생각 문자열로 객체

  • 색 물체
  • 태그 objcet에 메모를 추가합니다. 먼저 사용자가 취할 수있는 3 가지 동작에 대한 추상 기본 클래스 인 액션 클래스를 생각했습니다. 사용자가 이러한 액션을 취할 때마다이 추상 Action 클래스의 하위 클래스에 대한 적절한 새 인스턴스가 만들어져 모든 액션을 포함하는 목록에 삽입됩니다.

    사용자가 무언가를 실행 취소 할 때마다 사용자에게 목록이 표시되고 실행 취소 할 작업을 선택할 수 있습니다.

    지금 나는 그런 행동 객체에 저장하는 것을 생각하고 있었다 :

    • 작업
    • 찍은 실제 행동 (에 추가 된 예를 들어, 문자열 전에 객체의 상태 객체 노트)

    이것이 충분한 지 잘 모르겠습니다. 나는 또한 연대 순서와 같은 것에 대해 생각했다. 그러나 목록이 시간순으로 정확하게 유지 될 수 있기 때문에 이것이 필요하다.

    다른 고려해야 할 사항이 있습니까?

  • +1

    GOF에서 기념 무늬 검색 – pastjean

    +2

    또는 명령 패턴 – slayerIQ

    +1

    여기도 참조하십시오 : http://stackoverflow.com/questions/49755/design-pattern-for-undo-engine –

    답변

    14

    실행 취소/다시 실행은 일반적으로 i입니다. Command Pattern과 함께 구현됩니다. Action 클래스는이를위한 기초로 사용할 수 있지만 각 명령 내에서 '실행'작업과 '실행 취소'작업이 필요합니다. 이 실제로 Here is an example. 스택에 실행 된 명령은 구현하기가 훨씬 쉬우 며 사용자가 쉽게 따라 할 수 있으므로 저장해야합니다.

    2

    모두 올바르게 보이지만 목록보다는 스택을 사용하고 싶습니다. 연대순으로 정렬하는 데 유용합니다. UNDO 기능에 대한 올바른 입증 implememtation를 들어

    2

    이 명령 패턴입니다

    당신은이 같은 단순한 뭔가 할 수
    9

    :

    Stack<Action> undoStack = new Stack<Action>();  
    
    void ChangeColor(Color color) 
    { 
        var original = this.Object.Color; 
        undoStack.Push(() => this.Object.Color = original); 
        this.Object.Color = color; 
    } 
    
    +0

    나는 이것을 좋아합니다. 실제 행동을 저장하는 것을 생각한 적이 없었습니다 ... 아주 좋았습니다. – Crisfole

    관련 문제