티스토리 뷰
728x90
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
728x90
'디자인 패턴' 카테고리의 다른 글
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 |
댓글