티스토리 뷰

디자인 패턴

18. 메멘토 패턴

jin-park 2022. 2. 10. 21:09

1. 메멘토 패턴

  • 캡슐화를 유지하면서 객체 내부 상태를 외부에 저장하는 방법
    • 객체 상태를 외부에 저장했다가 해당 상태로 다시 복구할 수 있다.

다이어그램

  • Originator : 원래의 내부정보를 가지고있는 데이터 객체
    • createMementor() : 내부정보를 Memento클래스로 추상화하여 전달하는 Operation
    • restore() : 외부에서 전달받은 Memento 정보를 복원할 수 있는 기능을 제공하는 Operation
  • CareTaker : Originator 정보를 가지고와 복원

                              Originator 정보를 추상화해둔 Memento타입으로 가지고 있음

  • Memento : 원래의 내부정보를 추상화하여 보관하고 있는 객체
    • Memento() : 내부정보가 세팅되면 변경 불가하게끔 설정

2. 메멘토 패턴 적용

2.1. 적용 전 코드

  • 클라이언트가 게임의 내부정보를 모두 알고 있어야함
  • 문제 : Game의 내부정보를 변경될때마다 Client에 속해있는 Game의 디테일한 내역을 변경해줘야하는 경우 발생
  • 해결 : 내부 의존성을 끊어줘야함
public class Game implements Serializable {
 
    private int redTeamScore;
 
    private int blueTeamScore;
 
    public int getRedTeamScore() {
        return redTeamScore;
    }
 
    public void setRedTeamScore(int redTeamScore) {
        this.redTeamScore = redTeamScore;
    }
 
    public int getBlueTeamScore() {
        return blueTeamScore;
    }
 
    public void setBlueTeamScore(int blueTeamScore) {
        this.blueTeamScore = blueTeamScore;
    }
}
public class Client {
 
    public static void main(String[] args) {
        Game game = new Game();
        game.setRedTeamScore(10);
        game.setBlueTeamScore(20);
 
        int blueTeamScore = game.getBlueTeamScore();
        int redTeamScore = game.getRedTeamScore();
 
        Game restoredGame = new Game();
        restoredGame.setBlueTeamScore(blueTeamScore);
        restoredGame.setRedTeamScore(redTeamScore);
    }
}

2.2. 적용 후 코드

  • 게임의 디테일을 알지 않아도 게임의 내부정보를 저장했다가 복원되게끔 적용
  • Client : CareTaker
  • Game : Originator
  • GameSave : Memento
public final class GameSave {
 
    //저장된 정보 그대로 보관하고 있어야하기 때문에 final변수 사용
    private final int blueTeamScore;
 
    private final int redTeamScore;
 
    public GameSave(int blueTeamScore, int redTeamScore) {
        this.blueTeamScore = blueTeamScore;
        this.redTeamScore = redTeamScore;
    }
 
    public int getBlueTeamScore() {
        return blueTeamScore;
    }
 
    public int getRedTeamScore() {
        return redTeamScore;
    }
}
public class Game {
 
    private int redTeamScore;
 
    private int blueTeamScore;
 
    public int getRedTeamScore() {
        return redTeamScore;
    }
 
    public void setRedTeamScore(int redTeamScore) {
        this.redTeamScore = redTeamScore;
    }
 
    public int getBlueTeamScore() {
        return blueTeamScore;
    }
 
    public void setBlueTeamScore(int blueTeamScore) {
        this.blueTeamScore = blueTeamScore;
    }
 
    //Game 내부정보를 추상화하는 기능
    public GameSave save() {
        return new GameSave(this.blueTeamScore, this.redTeamScore);
    }
    //Game 내부정보를 복원하는 기능
    public void restore(GameSave gameSave) {
        this.blueTeamScore = gameSave.getBlueTeamScore();
        this.redTeamScore = gameSave.getRedTeamScore();
    }
 
}
public class Client {
 
    public static void main(String[] args) {
        Game game = new Game();
        game.setBlueTeamScore(10);
        game.setRedTeamScore(20);
 
        GameSave save = game.save();
 
        game.setBlueTeamScore(12);
        game.setRedTeamScore(22);
 
        game.restore(save);
 
        System.out.println(game.getBlueTeamScore());
        System.out.println(game.getRedTeamScore());
    }
}

3. 장점 및 단점

3.1. 장점

  • 객체의 내부상태를 외부에 노출하지 않고, 메멘토 타입으로 캡슐화하여 스냅샷을 제공할 수 있다.
  • CareTaker가 Originator의 기록을 유지하므로 코드가 단순화된다.
  • 단일 책임의 원칙 적용

3.2. 단점

  • 메멘토 객체가 많은 정보를 담고있고, 객체 생성이 자주 일어나게 되면 메모리 사용량에 영향을 줌 > 커다란 객체에 적용하기엔 다소 무리
  • 오래된 메멘토는 CareTaker가 정리해주는 역할까지 고려해줘야함

위글은 인프런의 코딩으로 학습하는 GoF의 디자인 패턴강의를 정리하였습니다.

백기선님의 수락으로 정리하였으며 더 자세한 내용은 강의를 수강하시기 바랍니다.

https://www.inflearn.com/course/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4/dashboard

 

코딩으로 학습하는 GoF의 디자인 패턴 - 인프런 | 강의

디자인 패턴을 알고 있다면 스프링 뿐 아니라 여러 다양한 기술 및 프로그래밍 언어도 보다 쉽게 학습할 수 있습니다. 또한, 보다 유연하고 재사용성이 뛰어난 객체 지향 소프트웨어를 개발할

www.inflearn.com

 

'디자인 패턴' 카테고리의 다른 글

20. 상태(State) 패턴  (0) 2022.02.11
19. 옵저버 패턴  (0) 2022.02.11
17. 중재자 패턴  (0) 2022.02.10
16. 이터레이터 패턴  (0) 2022.02.10
15. 인터프리터 패턴  (0) 2022.02.10
댓글