[디자인 패턴(C#)] 메멘토 패턴

순후추·2024년 2월 26일
0

디자인패턴

목록 보기
11/11

어떤 패턴인가?

  • 객체 상태의 스냅샷을 만들어 나중에 복원할 수 있도록 해주는 패턴입니다.

어느 상황에 쓰일 수 있는 가?

  • 비주얼 노벨 게임에서 게임 기록 혹은 이전 상태 복원
  • 뒤로 가기
  • 플레이어의 진행 상황

샘플 코드

using System;
using System.Collections.Generic;

// Memento 클래스
public class Memento
{
    public string State { get; private set; }

    public Memento(string state)
    {
        this.State = state;
    }
}

// Originator 클래스
public class Originator
{
    public string State { get; set; }

    // 상태를 저장하는 Memento를 생성함
    public Memento SaveStateToMemento()
    {
        return new Memento(State);
    }

    // Memento에서 상태를 복원함
    public void GetStateFromMemento(Memento memento)
    {
        State = memento.State;
    }
}

// Caretaker 클래스
public class Caretaker
{
    private List<Memento> mementoList = new List<Memento>();

    public void Add(Memento state)
    {
        mementoList.Add(state);
    }

    public Memento Get(int index)
    {
        return mementoList[index];
    }
}

class Program
{
    static void Main(string[] args)
    {
        Originator originator = new Originator();
        Caretaker caretaker = new Caretaker();

        // 캐릭터 상태 변경 및 저장 예시
        originator.State = "상태 #1";
        originator.State = "상태 #2";
        caretaker.Add(originator.SaveStateToMemento());

        originator.State = "상태 #3";
        caretaker.Add(originator.SaveStateToMemento());

        originator.State = "상태 #4";
        Console.WriteLine("Current State: " + originator.State);

        // 상태 복원 예시
        originator.GetStateFromMemento(caretaker.Get(0));
        Console.WriteLine("First saved State: " + originator.State);
        originator.GetStateFromMemento(caretaker.Get(1));
        Console.WriteLine("Second saved State: " + originator.State);
    }
}
profile
게임 개발 블로그

0개의 댓글

관련 채용 정보