Mementoパターンとは、オブジェクトの状態を保存し、後からその状態に戻せるようにするデザインパターンだ。これにより、オブジェクトの状態を保存して、必要なときに復元することができる。
たとえば、ゲームでセーブポイントを作って、後からその時点の状態に戻ることができるような仕組みで使える。
では、サンプルコードを一緒に見ていこう。
まず、ゲームの進行状況を保存するための「Memento」クラスを作ろう。これは、ゲームの状態(例えば、レベルやスコア)を保存する役割を持つ。
// ゲームの状態を保存するMementoクラス
class GameMemento {
constructor(level, score) {
this.level = level;
this.score = score;
}
}
次に、ゲームの進行状況を管理するクラスを作る。このクラスは、状態を保存し、必要に応じて以前の状態に戻すことができるようにする。
// ゲームの進行を管理するクラス
class Game {
constructor() {
this.level = 1;
this.score = 0;
}
// ゲームの状態を保存する
save() {
return new GameMemento(this.level, this.score);
}
// 保存された状態に戻す
restore(memento) {
this.level = memento.level;
this.score = memento.score;
}
// ゲームの状態を更新する
play(level, score) {
this.level = level;
this.score = score;
}
displayStatus() {
console.log(`レベル: ${this.level}, スコア: ${this.score}`);
}
}
最後に、ゲームを進めながらセーブとロード機能を使ってみよう。途中で状態を保存し、後でその状態に戻すことができる。
// ゲームのインスタンスを作成
const game = new Game();
// ゲームを進める
game.play(5, 100);
game.displayStatus(); // レベル: 5, スコア: 100
// ゲームの状態をセーブする
const savedGame = game.save();
// さらにゲームを進める
game.play(10, 200);
game.displayStatus(); // レベル: 10, スコア: 200
// ゲームをセーブした状態に戻す
game.restore(savedGame);
game.displayStatus(); // レベル: 5, スコア: 100
これでMementoパターンの解説は終わりだ。
このパターンを使うと、オブジェクトの状態を簡単に保存・復元できるため、セーブ機能や元に戻す機能を実装する際に便利だ。