【デザインパターン】MEMENTOパターン

処理前の内部状態(Memento)を保持し、状態を復元する仕組みです。

package com.example.memento;

public class Memento {
    int protectedInfo;

    Memento(int protectedInfo) {
        this.protectedInfo = protectedInfo;
    }

    int getProtectedInfo() {
        return protectedInfo;
    }

    public int getPublicInfo() {
        return protectedInfo;
    }
}
package com.example.memento;

public class Originator {
    private int info;

    public Originator(int info) {
        this.info = info;
    }

    public Memento createMemento() {
        Memento memento = new Memento(info);
        return memento;
    }

    public void restoreMemento(Memento memento) {
        this.info = memento.protectedInfo;
    }

    public void process() {
        info++;
    }

    public String toString() {
        return Integer.toString(info);
    }
}
package com.example.main;

import com.example.memento.Memento;
import com.example.memento.Originator;

public class Caretaker {
public static void main(String[] args) {
int info = 1;

Originator originator = new Originator(info);
Memento memento = originator.createMemento();

originator.process(); // 更新
originator.toString(); // 出力
originator.restoreMemento(memento); // レストア
originator.toString(); // 出力
}
}

MementoとOriginator は同じパッケージに含まれますが、Caretaker は別のパッケージで構成されます。

Caretaker はMementoを保持し、好きなタイミングで復元することができますが、Caretaker は直接Mementoのデータを書き換えることはできません。

なので、データの一貫性を保持しつつ、データを復元することができるようになります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください