정의 ?
캡슐화를 유지하면서 객체 내부 상태를 외부에 저장하는 방법.
Originator : 원래의 데이터를 가진 객체.
CareTaker : Originator의 내부정보를 Memento라는 타입으로 가지고 와서 저장하고 있음.
Memento : Originator 객체의 추상화 객체.
따라서 Originator는 두 가지의 operation을 제공해야함.
- createMemento() : 내부정보를 Memento 클래스로 추상화해서 전달함.
- restore(Memento) : 외부에서 전달받은 Memento 정보로 자신의 정보를 복원함.
또한, Memento 는 변경불가능한 객체로 구성하여 Originator의 정보를 CareTaker에 전달함.
예제
/* Memento.class
* 객체의 값이 변경되지 않아야함.
* 방법1. -> final 변수로 선언 : 값이 변경되는 걸 방지하고, 상속을 막음.
* 방법2. -> 생성자를 통해서만 값이 생성될 수 있도록하고, Getter만 제공함.
*/
public class GameSave {
private final int blueTeamScore;
private final int redTeamScore;
public void GameSave(int blueTeamScore, int redTeamScore){
this.blueTeamScore = blueTeamScore;
this.redTeamScore = redTeamScore;
}
public int getBlueTeamScore(){
return blueTeamScore;
}
public int getRedTeamScore(){
return redTeamScore;
}
}
/* Originator.class
* 1. Memento.class를 이용하여 값을 저장하는 클래스와
* Memento.class를 이용하여 값을 복원할 수 있는 클래스를 제공해야함.
*/
public class Game {
private int redTeamScore;
private int blueTeamScore;
public getRedTeamScore() { return redTeamScore; }
public setRedTeamScore(int redTeamScore) { this.redTeamScore = redTeamScore; }
public getBlueTeamScore() { return blueTeamScore; }
public setBlueTeamScore(int blueTeamScore) { this.blueTeamScore = blueTeamScore; }
public GameSave save(){
return new GameSave(this.blueTeamScore, this.redTeamScore);
}
public void restore(GameSave gameSave){
this.blueTeamScore = gameSave.blueTeamScore;
this.redTeamScore = gameSave.redTeamScore;
}
}
public class Client {
public static void main(String[] args){
Game game = new Game();
game.setBlueTeamScore(10);
game.setRedTeamScore(20);
// 값 저장 -- 시점1
GameSave save = game.save();
System.out.println(game.getBlueTeamScore()); // 10
System.out.println(game.getRedTeamScore()); // 20
// Originator의 값이 변경됨.
game.setBlueTeamScore(12);
game.setBlueTeamScore(22);
// 값 복원 -- 시점1
game.store(save);
System.out.println(game.getBlueTeamScore()); // 10
System.out.println(game.getRedTeamScore()); // 20
}
}
메멘토 패턴 장/단점
- 장점
- 단일책임의 원칙을 지킬 수 있음.
- 단점
- 메모리의 사용량이 증가함에 따라, 일정량의 Memento 만 유지하기 위해, CareTaker 클래스에서 메모리를 정리하는 역할을 해야할 수 있음.
'CS > GoF Design Pattern' 카테고리의 다른 글
프로토타입 (Prototype) 패턴 (0) | 2022.05.22 |
---|---|
싱글톤 (Singleton) 패턴 (0) | 2022.05.22 |