Dyuichi Blog

オブジェクト指向シリーズⅣ: デザインパターン [⑱ Memento]

概要

mementoは日本語で「記念品」,「形見」という意味になる.Mementoパターンは,ある時のオブジェクトの状態を保存しておき,必要に応じて復元するパターンである.

Mementoパターンの主な要素は以下である.

  • Memento:Originatorの内部状態を保存するオブジェクト
  • Originator:内部状態を保存するためにMementoオブジェクトを生成するクラス
  • Caretaker:Mementoオブジェクトを保管しておくクラス

クラス図

画像が読み込まれない場合はページを更新してみてください。

実装例(Java)

javaimport java.util.ArrayList;
import java.util.List;

// Memento
class Memento {
    private String state;
    public Memento(String state) {
        this.state = state;
    }
    public String getState() {
        return state;
    }
}

// Originator
class Originator {
    private String state;
    public void setState(String state) {
        this.state = state;
    }
    public String getState() {
        return state;
    }
    public Memento saveStateToMemento() {
        return new Memento(state);
    }
    public void getStateFromMemento(Memento memento) {
        state = memento.getState();
    }
}

// CareTaker
class CareTaker {
    private List<Memento> mementoList = new ArrayList<>();
    public void add(Memento memento) {
        mementoList.add(memento);
    }
    public Memento get(int index) {
        return mementoList.get(index);
    }
}

// Client
public class MementoPattern {
    public static void main(String[] args) {
        Originator originator = new Originator();
        CareTaker careTaker = new CareTaker();
        
        originator.setState("State #1");
        originator.setState("State #2");
        careTaker.add(originator.saveStateToMemento());
        
        originator.setState("State #3");
        careTaker.add(originator.saveStateToMemento());
        
        originator.setState("State #4");
        System.out.println("Current State: " + originator.getState());
        
        originator.getStateFromMemento(careTaker.get(0));
        System.out.println("First saved State: " + originator.getState());
        
        originator.getStateFromMemento(careTaker.get(1));
        System.out.println("Second saved State: " + originator.getState());
    }
}

まとめ,所感

インスタンスの状態がプログラム実行中にどんどん変化するケースがあれば,Mementoパターンを使って前の状態に戻すことは有効である.

しかし,インスタンスの状態がプログラム実行中にどんどん変化するケースはどのようなケースだろうか?具体的なケースは思いつけないが,プロパティが変わっていくケースは十分あり得る気がする.