728x90
반응형
Memento Pattern
캡슐화를 유지하면서 객체 내부 상태를 외부에 저장하는 방법
객체 상태를 외부에 저장했다가 해당 상태로 다시 복구할 수 있다.
BEFORE
Client
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);
}
}
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;
}
}
AFTER
Client
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());
}
}
Game
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;
}
public GameSave save() {
return new GameSave(this.blueTeamScore, this.redTeamScore);
}
public void restore(GameSave gameSave) {
this.blueTeamScore = gameSave.getBlueTeamScore();
this.redTeamScore = gameSave.getRedTeamScore();
}
}
GameSave
public final class GameSave {
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;
}
}
[패턴 복습]
장점 | 단점 |
- 캡슐화를 지키면서 상태 객체 스냅샷을 만들 수 있다. - 객체 상태 저장하고 또는 복원하는 역할을 CareTaker에게 위임할 수 있다. - 객체 상태가 바뀌어도 클라이언트 코드는 변경되지 않는다. |
- 많은 정보를 저장하는 Mementor를 자주 생성하는 경우 메모리 사용량에 많은 영향을 줄 수 있다. |
[실무에서 쓰이는 경우]
- 자바
- 객체 직렬화, java.io.Serializable
- java.util.Date
728x90
반응형
'Design Patterns > 행동(Behavioral)' 카테고리의 다른 글
[State]상태 패턴 (0) | 2022.11.22 |
---|---|
[Observer]옵저버패턴 (0) | 2022.11.08 |
[Mediator]중재자패턴 (0) | 2022.11.01 |
[Iterator]이터레이터패턴 (0) | 2022.10.25 |
[Interpreter]인터프리터패턴 (0) | 2022.10.25 |