OOP/Design Pattern

17. 메멘토(Memento) 패턴

지구우중 2023. 2. 25. 12:33

메멘토(Memento) 패턴: 행위패턴

 


 

객체의 상태 정보를 저장하고 사용자의 필요에 의하여 원하는 시점의 데이터를 복원 할 수 있는 패턴

 특정 시점에서의 객체 내부 상태를 객체화함으로써 이후 요청에 따라 객체를 해당 시점의 상태로 돌릴 수 있는 기능을 제공하는 패턴. 포토샵 되돌리기나 뒤로가기를 떠올리면 이해가 쉬울 것이다.

  • Originator : 현재 상태를 표현하는 State를 가지고 있으며, Memento 객체를 통해 현재 상태를 변경
  • Memento : Originator의 상태를 나타내는 클래스, Memento를 이용하여 Originator의 상태를 변경
  • CareTaker : Memento를 순서대로 저장하여 관리하는 클래스, Stack이나 List 같은 자료구조를 사용해도 무방

PhotoShap(Originator)

package behavioral.memento;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class PhotoShap {
   private String status;

    public PhotoShap(String status) {
        this.status = status;
    }

    public Memento createMemento(){
        return new Memento(status);
    }

    public void restoreMemento(Memento memento){
        this.status = memento.getStatus();
    }
}

 

Memento

package behavioral.memento;

import lombok.Getter;

@Getter
public class Memento {
    private String status;

    public Memento(String status) {
        this.status = status;
    }
}

 

CareTaker

package behavioral.memento;

import java.util.Stack;

public class CareTaker {

    Stack<Memento> mementos = new Stack<>();

    public void push(Memento memento){
        mementos.push(memento);
    }

    public Memento pop(){
        return mementos.pop();
    }
}

 

MementoClient

package behavioral.memento;

public class MementoClient {
    public static void main(String[] args) {
        PhotoShap photoShap = new PhotoShap("네모그리기");
        CareTaker careTaker = new CareTaker();

        careTaker.push(photoShap.createMemento());
        System.out.println(photoShap.getStatus());
        photoShap.setStatus("세모그리기");

        System.out.println(photoShap.getStatus());
        photoShap.restoreMemento(careTaker.pop());
        System.out.println(photoShap.getStatus());
    }
}