直訳すると「記念品」「思い出」という意味。今の状態を保存しておいて、復帰できるようにする。
ゲームで言えばセーブ。今のプレイ状況を保存しておくこと。
以下、プレイヤーデータのHPとMPを保存して復帰する簡単なサンプル。
// セーブデータ(Memento役、記念品) SaveData.java package player; public class SaveData { int hp; int mp; SaveData(int hp, int mp) { this.hp = hp; this.mp = mp; } }
// プレイヤーデータ(Originator役、作成者) Player.java package player; public class Player { private int hp; private int mp; public Player(int hp, int mp) { this.hp = hp; this.mp = mp; } // セーブデータを作る public SaveData createSaveData() { SaveData data = new SaveData(hp, mp); return data; } // セーブデータを読み込んで復帰 public void restoreSaveData(SaveData data) { this.hp = data.hp; this.mp = data.mp; } // HPとMPを変更 public void setHpMp(int hp, int mp) { this.hp = hp; this.mp = mp; } // 文字列表現 public String toString() { return "HP=" + hp + " MP=" + mp; } }
// テストメイン(Caretaker役、世話をする人) Main.java import player.Player; import player.SaveData; public class Main { public static void main(String[] args) { Player player = new Player( 100, 50 ); System.out.println( player ); // データセーブ SaveData save = player.createSaveData(); // HP,MPを変更 player.setHpMp( 50, 25 ); System.out.println( player ); // セーブデータで復帰 player.restoreSaveData( save ); System.out.println( player ); } }
実行結果
HP=100 MP=50 HP=50 MP=25 HP=100 MP=50
SaveDataクラスとPlayerクラスはplayerパッケージに入っており、SaveDataクラスのコンストラクタにはpublicが付いていないため、MainからSaveDataのインスタンスを作成することは出来ない。もちろんメンバ変数にもアクセスできない。MainからはPlayerのインスタンスのメソッドを使ってのみSaveDataのインスタンスを取得できる。
このようにすることによってセーブする内容が変わっても、Mainクラスは変更する必要がない。また、複数のセーブデータを持ちたい場合には、SaveDataクラスやPlayerクラスを変更する必要がない。
このようにCaretaker(世話をする人)役とOriginator(作成者)役を分けることが重要。