1.1. 의도
- 캡슐화(외부에서 맴버 변수의 값을 변경할 수 없도록 함)를 위배하지 않으면서 객체 내부의 상태를 캡슐화 해서 저장하고, 나중에 객체가 해당 상태로 복구 가능하도록 한다.
1.2. 예제
- Memento 구조체를 생성하여 필수 정보 저장
- 이후 Save()와 Restore()를 통해서 저장 복구 가능
#pragma once #include <map> enum color { red = 1, green = 2, blue = 3}; class Graphic { struct Memento { int penWidth; int penColor; Memento(int w, int c) : penWidth(w), penColor(c) {} }; std::map<int, Memento*> memento_map; int penWidth = 1; int penColor = 0; int temporary_data; public: int save() { static int key = 0; ++key; Memento* p = new Memento(penWidth, penColor); memento_map[key] = p; return key; } void restore(int token) { penColor = memento_map[token]->penColor; penWidth = memento_map[token]->penWidth; } void draw_line(int x1, int y1, int x2, int y2) { } void set_stroke_color(int c) { penColor = c; } void set_stroke_width(int w) { penWidth = w; } };
뭔가를 그리는 상황에서 모든 변경값을 함수 인자로 받아와서 진행도 가능하지만, 객체에 저장된 기본정보를 수정하게 하고, 함수에서는 객체의 기본정보를 활용할 수도 있음
사실상 Strategy Pattern과 동일하지만, 알고리즘을 교체할 때는 Strategy, 상태는 동작을 변경하는 경우 State로 명명 한다.
Strategy Pattern과 동일하지만, 객체를 생성하는 관점에서는 Builder는 객체를 변경하는 경우에 적용하는 개념이라고 생각하면 된다.