Memento Pattern 

 - 객체의 상태 저장을 위한 패턴

 - 클래스 내부에 인스턴스 내부의 상태를 나타내는 역할을 도입해서 캡슐화의 파괴에 빠지지 않고  저장과 복원을 실행하는 패턴

 - 커맨드 패턴과 비슷하니 잘 분리를 해서 사용해야함.

Ex. 직렬화 (Serialization), Date, snap shot. 자바 내부에서 거의 쓰이지 않는다.


  1. class Machine {
  2.         private int state1;
  3.         private int state2;
  4.  
  5.         private class Memento {
  6.                 int state1;
  7.                 int state2;
  8.         }
  9.  
  10.         private List<Memento> backup = new ArrayList<>();
  11.  
  12.         public int createMemento() {
  13.                 Memento m = new Memento();
  14.                 m.state1 = this.state1;
  15.                 m.state2 = this.state2;
  16.                 backup.add(m);
  17.  
  18.                 return backup.size() - 1; // 특정 토큰을 반환한다.
  19.         }
  20.        
  21.         void restoreState(int token) {
  22.                 Memento m = backup.get(token); // 저장된 토큰으로 복구한다.
  23.                 this.state1 = m.state1;
  24.                 this.state2 = m.state2;
  25.                
  26. //              backup.remove(token); // 복구 시 삭제하는 것은 정책으로 결정.
  27.                
  28.         }
  29.         void setState(int a, int b) {
  30.                 this.state1 = a;
  31.                 this.state2 = b;
  32.         }
  33.  
  34.         @Override
  35.         public String toString() {
  36.                 return "Machine [state1=" + state1 + ", state2=" + state2 + ", backup="
  37.                                 + backup + "]";
  38.         }
  39.        
  40. }
  41.  
  42. public class Ex2 {
  43.  
  44.         public static void main(String[] args) {
  45.                 Machine m = new Machine();
  46.                 m.setState(12);
  47.                 System.out.println(m.toString());
  48.                 int token = m.createMemento();
  49.                
  50.                 m.setState(3040); // 중간에 상태가 바뀌어도
  51.                 System.out.println(m.toString());
  52.                 m.restoreState(token); // 기억된 토큰으로 복구 시킬 수 있다.
  53.                 System.out.println(m.toString());
  54.                
  55.         }
  56.  
  57. }


'java > design_pattern' 카테고리의 다른 글

Facade Pattern - 퍼사드 패턴  (0) 2014.07.01
Bridge Pattern - 브릿지 패턴  (0) 2014.07.01
Command Pattern - 명령패턴  (0) 2014.07.01
Proxy Pattern - 대리자 패턴  (0) 2014.07.01
Iterator Pattern - 열거자  (0) 2014.07.01

+ Recent posts