Work & Programming/System Design

[Behavioral Pattern] - Memento

자전거통학 2024. 5. 16. 09:38

https://refactoring.guru/design-patterns/memento

 

Memento

/ Design Patterns / Behavioral Patterns Memento Also known as: Snapshot Intent Memento is a behavioral design pattern that lets you save and restore the previous state of an object without revealing the details of its implementation. Problem Imagine that

refactoring.guru

 

 

 

객체의 상태를 특정 시점에 백업하고 이를 저장해 놓는다. 

원하는 때에 원하는 상태로 객체의 백업해 놓은 데이터를 이용해 되돌아 간다. 

 

예제

 - Puzzle 게임의 TimeMachine 같은 기능을 구현 하고자 할 때. 

 - 툴의 버튼 등으로 인한 상태 변화를 UNDO 하고자 할 때.

 

예제 코드 

더보기
public interface IMemento
{
    IMemento BackUp();
    void Restore(IMemento mem);
}

public class MiniGameStates : IMemento
{
    // some data.
    //
    public IMemento BackUp()
    {
        MiniGameStates curState = new MiniGameStates();
        // copy.
        return curState;
    }
    public void Restore(IMemento oldState)
    {}
}

public class MiniGame
{
    IMemento states;

    List<IMemento> gameStates = new List<IMemento>();

    public void SetMemento(IMemento mento) { states = mento; }

    public void Exe()
    {
        // Do some.
        Console.WriteLine("Some action!");
        //
        gameStates.Add( states.BackUp() );
    }

    public void Undo()
    {
        states.Restore( gameStates[gameStates.Count - 1] );
        gameStates.RemoveAt(gameStates.Count - 1 );
    }
}

internal class MementoDemo
{
    public void Run()
    {
        MiniGame mini = new MiniGame();
        mini.SetMemento(new MiniGameStates());

        mini.Exe();
        mini.Exe();

        mini.Undo();
    }
}