Somethingこの広告は、90日以上更新していないブログに表示しています。パターンとはオブジェクトを以前の状態に(ロールバックにより)戻す能力を提供する。Wikipediaオブジェクト指向のプログラムでundo(やり直し)を実現するには、インスタンスの持っている情報を保存しておく必要がある。保存しておくだけでは駄目で、保存しておいた情報からインスタンスを元の状態に戻せなければならない。インスタンスを復元するためには、インスタンス内部の情報にアクセスできる必要がある。不用意にアクセスを許可してしまうと、そのクラスの内部構造に依存したコードがプログラムのあちこちに散らばり、クラスの修正がしにくくなってしまう。これをカプセル化の破壊と言う。インスタンスの状態を表す役割を導入し、カプセル化の破壊に陥ることなく保存と復元を行うのが、Mementoパターンである。Mementoパターンを用いると、プログラムに対してundo(やり直し)redo(再実行)history(作業履歴の作成)snapshot(現在の状態の保存)exampleMementoパターンを使ったサンプルプログラム「フルーツを集めていくサイコロゲーム」を作成する。このゲームのルールは以下の通りこのゲームは自動進行する主人公はサイコロを振り、その目が次の状態を決定するサイコロの目によって、お金が増えるお金が減るフルーツを貰うお金がなくなったら終了するサンプルコード中では、お金が貯まったところで、将来のためにMementoクラスのインスタンスを作成し、「現在の状態」を保存する。保存するのは現在持っているお金とフルーツ。負け続けてお金が減ってきたら、お金がなくなって終了しないように、以前保存しておいたMementoのインスタンスを使って、以前の状態を復元する。クラス主人公(Gamer)の状態を表現するクラス。クラスゲームを行う主人公を表現しているクラス。createMementoメソッドは、現在の状態を保存する(snapshot)。このメソッドはMementoを作成する。フルーツについては、「おいしい」ものだけを保存している。restoreMementoメソッドは、createMementoメソッドの逆で、undoを行う。与えられたMementoのインスタンスを元に、自身の状態を復元する。"所持金が増えました。"所持金が半分になりました。"何も起こりませんでした。}}MainGamerのインスタンスを作成し、それを使ってゲームを行う。Gamerのbetメソッドを繰り返し呼び出し、その度に現在の状態を表示する。Mementoパターンを導入し変数mementoに「ある時点のGamerの状態」を保存する。お金が増えてきたら、createMementoを使って現在の状態を保存する。お金が足りなくなってきたら、restoreMementoメソッドにこのmementoを与えて所持金を元に戻す。]所持金が半分になりました。所持金は50円になりました。]所持金が半分になりました。所持金は25円になりました。]所持金が増えました。所持金は200円になりました。]所持金が増えました。所持金は300円になりました。]所持金が半分になりました。所持金は150円になりました。]フルーツ(リンゴ)をもらいました。所持金は150円になりました。リンゴ]何も起こりませんでした。所持金は150円になりました。リンゴ]何も起こりませんでした。所持金は150円になりました。リンゴ]何も起こりませんでした。所持金は150円になりました。リンゴ]何も起こりませんでした。所持金は150円になりました。リンゴ]所持金が増えました。所持金は250円になりました。バナナ]所持金が増えました。所持金は375円になりました。バナナ]何も起こりませんでした。所持金は375円になりました。バナナ]何も起こりませんでした。所持金は375円になりました。バナナ]フルーツ(みかん)をもらいました。所持金は375円になりました。みかん]所持金が半分になりました。所持金は187円になりました。おいしいみかん]何も起こりませんでした。所持金は550円になりました。おいしいみかん]所持金が半分になりました。所持金は275円になりました。おいしいみかん]所持金が半分になりました。所持金は137円になりました。おいしいみかん]所持金が半分になりました。所持金は275円になりました。おいしいみかん]所持金が半分になりました。所持金は137円になりました。(だいぶ減ったので、以前の状態に復帰しよう)ソースコードgithub.com役割Originator役この役は、自分の現在の状態を保存したいときにMemento役を作る。Originator役はまた、以前のMemento役を渡されると、そのMemento役を作った時点の状態に戻る処理を行う。サンプルコードにおけるGamerクラス。Memento役この役は、Originator役の内部情報をまとめる。Memento役はOriginator役の内部情報を持っているが、その情報を誰にでも公開するわけではない。Memento役は次の2種類のインターフェースを持っている。オブジェクトの状態を元に戻すために必要な情報がすべて得られるメソッドの集合。これを使えるのはOriginator役のみ。外部のCaretaker役に見せるもの。内部状態が外部に公開されるのを防ぐ。この2種類のインターフェースを使い分けることでオブジェクトのカプセル化の破壊を防ぐことができる。この役はサンプルコードにおけるMementoクラス。現在のOriginator役の状態を保存したいときに、そのことをOriginator役に伝える。Originator役はそれを受けてMementoを作り、Caretaker役に渡す。Caretaker役は将来の必要に備えて、そのMemento役を保存しておく。サンプルコードにおけるMain.php。まとめサンプルコードでは1つのMementoしか保存しなかった(上書きで最新保存)が、Mementoのインスタンスを複数個持つようにすれば、インスタンスの様々な時点での状態を保存できる。Memento役をCaretaker役が保存しておき、必要なときにはMemento役を取り出して、Originator役に渡すことで復元ができる。これがMementoパターン。動作を表現するオブジェクトを示す。(1)はてなブログをはじめよう!tic40さんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。