개발/디자인패턴

[Java][디자인 패턴] 21. 메멘토 패턴 (Memento Pattern)

nova_dev 2022. 3. 25. 00:00
반응형

디자인패턴
[Java][디자인 패턴] 21. 메멘토 패턴 (Memento Pattern)

메멘토 패턴은 상태의 객체를 저장하여 이전 상태로 복구하는 패턴이다.

 

 메멘토 패턴이란?

  • 메맨토 패턴은 중간 매개체를 통해 객체의 상태를 다른 객체에 저장했다가 복원하는 방법을 사용한다.
  • 메멘토 패턴은 객체의 상태를 관리한다. 객체의 상태를 저장하고, 저장된 상태의 객체로 복원한다.

 메멘토 패턴 구성요소

  • 원조본(originator)
  • 케어테이커(caretaker)

 메멘토 패턴 코드

1. 상태 클래스 (TextWindowState)

public class TextWindowState {

    private String text;

    public TextWindowState(String text) {
        this.text = text;
    }

    public String getText() {
        return text;
    }
    
}

2. 원조본(Originator) 

public class TextWindow {

    private StringBuilder currentText;

    public TextWindow() {
        this.currentText = new StringBuilder();
    }

    public String getCurrentText() {
        return currentText.toString();
    }

    public void addText(String text) {
        currentText.append(text);
    }

    public TextWindowState save() {
        return new TextWindowState(currentText.toString());
    }

    public void restore(TextWindowState save) {
        currentText = new StringBuilder(save.getText());
    }
}

 

3. Caretaker (케어테이커)

public class TextEditor {

    private TextWindow textWindow;
    private TextWindowState savedTextWindow;

    public TextEditor(TextWindow textWindow) {
        this.textWindow = textWindow;
    }

    public void write(String text) {
        textWindow.addText(text);
    }

    public String print() {
        return textWindow.getCurrentText();
    }

    public void hitSave() {
        savedTextWindow = textWindow.save();
    }

    public void hitUndo() {
        textWindow.restore(savedTextWindow);
    }
}

4. 테스트 코드

import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;

class TextEditorTest {
    @Test
    void givenTextEditor_whenAddTextSaveAddMoreAndUndo_thenSavecStateRestored() {
        TextEditor textEditor = new TextEditor(new TextWindow());
        textEditor.write("메멘토 패턴을 공부한다.\n");
        textEditor.hitSave();
        textEditor.write("오늘은 집중이 안되는 날이다.\n");
        textEditor.hitUndo();
        textEditor.write("언능 끝내고 자야겠다.\n");
        textEditor.hitUndo();
        
        assertThat(textEditor.print()).isEqualTo("메멘토 패턴을 공부한다.\n");
    }
}

 

 원본 코드

https://www.baeldung.com/java-memento-design-pattern

참고 자료

 

 

 

 

 

반응형