메멘토(Memento) 패턴
캡슐화를 유지하면서 객체 내부 상태를 외부에 저장하는 방법
객체 상태를 외부에 저장했다가 해당 상태로 다시 복구할 수 있다.
메멘토(Memento) 패턴 before
Game 클래스
@Getter @Setter
public class Game {
private int redTeamScore;
private int blueTeamScore;
}
Game 클래스는 간단하게 2가지 상태를 가진다.
Client 클래스
public class Client {
public static void main(String[] args) {
Game game = new Game();
game.setRedTeamScore(10);
game.setBlueTeamScore(10);
int redTeamScore = game.getRedTeamScore();
int blueTeamScore = game.getBlueTeamScore();
Game reStartGame = new Game();
reStartGame.setRedTeamScore(redTeamScore);
reStartGame.setBlueTeamScore(blueTeamScore);
}
}
현재 클라이언트는 Game에 대한 구체적인 정보인 redTeamScore와 blueTeamScore를 알아야지
다시 게임을 시작할 수 있다.
현재는 상태가 2개만 존재하지만 상태의 개수가 늘어나거나 상태 자체가 바뀐다면?
이는 클라이언트 코드의 변경을 의미한다.
메멘토 패턴을 적용해서 객체의 상태를 외부에 저장하고 Game에 대한 캡슐화를 지켜보자
메멘토(Memento) 패턴 after
GameSave
@Getter
public final class GameSave {
private final int blueTeamScore;
private final int redTeamScore;
public GameSave(int blueTeamScore, int redTeamScore){
this.blueTeamScore = blueTeamScore;
this.redTeamScore = redTeamScore;
}
}
GameSave 클래스는 Game 클래스의 상태를 저장하는 Memento에 해당한다.
Memento는 외부에서 값 변경이 불가능 하도록 Immutable 하게 만든다.
Game
@Getter @Setter
public class Game {
private int redTeamScore;
private int blueTeamScore;
public GameSave save(){
return new GameSave(this.blueTeamScore, this.redTeamScore);
}
public void restore(GameSave gameSave){
this.blueTeamScore = gameSave.getBlueTeamScore();
this.redTeamScore = gameSave.getRedTeamScore();
}
}
기존 코드에서 save(), restore()를 추가했다.
이제 클라이언트는 save()를 통해서 내부 상태를 저장하는 GamsSave 객체를 받고
다시 해당 상태로 바꾸고 싶으면 restore()에 GameSave 객체를 넘겨주면 된다.
클라이언트
public class Client {
public static void main(String[] args) {
Game game = new Game();
game.setRedTeamScore(10);
game.setBlueTeamScore(20);
GameSave save = game.save();
game.setRedTeamScore(100);
game.setBlueTeamScore(10);
game.restore(save);
System.out.println(game.getBlueTeamScore()); // 20
System.out.println(game.getRedTeamScore()); // 10
}
}
메멘토 패턴을 적용한 덕분에 내부상태가 캡슐화되었다.
이제 클라이언트는 Game 구체적인 상태를 몰라도 상태를 저장하고 복원이 가능하다.
이는 Game의 변경이 클라이언트에게 거의 전파되지 않는다.
메멘토(Memento) 패턴 정리
장점
캡슐화를 지키면서 상태 객체 상태 스냅샷을 만들 수 있다
객체 상태 저장하고 또는 복원하는 역할을 CareTaker에게 위임할 수 있다
객체 상태가 바뀌어도 클라이언트 코드는 변경되지 않는다
단점
많은 정보를 저장하는 Mementor를 자주 생성하는 경우 메모리 사용량에 많은 영향을 줄 수 있다
'Computer Sience > Desgin Pattern' 카테고리의 다른 글
[Design Pattern] 중재자(Mediator) 패턴 (0) | 2024.11.04 |
---|---|
[Design Pattern] 이터레이터(Iterator) 패턴 (2) | 2024.10.31 |
[Design Pattern] 인터프리터(Interpreter) 패턴 (0) | 2024.10.31 |
[Design Pattern] 커맨드(Command) 패턴 (1) | 2024.10.31 |
[Design Pattern] 책임 연쇄(Chain of Responsibility) 패턴 (1) | 2024.10.31 |