読者です 読者をやめる 読者になる 読者になる

【デザインパターン】Memento

デザインパターン

どういうもの?

  • あるオブジェクトの任意の時点の状態を保存しておき、後でその状態にオブジェクトを戻す

典型的な構成要素

  • Originator
    • 自分の状態を保存したMementoを作成する
    • 要求されたMementoに状態を戻す
  • Memento
    • Originatorの内部情報を保持する。
    • MementoはOriginatorと親密な関係
  • Caretaker
    • Originatorの状態を保存したい場合、ある時点に戻したい場合はOriginatorに指示する。
    • 保存するように指示を出した場合は、その時点の状態のMementoを受け取り、保持する。

      コード

class Memento{
public:
  Memento(int num):num(num){}
  int getNum(void){return num;}
private:
  int num;
};

class Number{
public:
  Number(int num):num(num){}
  int getNum(void){return num;}
  void increment(void){num++;}

  Memento* createMemento(void){
    Memento *memento = new Memento(num);
    return memento;
  }

  void restoreMemento(Memento *memento){
    num = memento->getNum();
  }

private:
  int num;
};

int main(void){
  Number number(10);
  Memento *memento = number.createMemento();

  for(int i=0;i<10;i++){
    cout << number.getNum() << endl;
    number.increment();
    if(number.getNum()%10==0){
      cout << "Restore" << endl;
      number.restoreMemento(memento);
    }
  }

  return 0;
}