この記事では、Javaのレベルパスゲーム関数を実装するためのメモモードの使用について説明します。次のように、参照のために共有してください。
1。パターン定義
メモモードは、エンクロージャーを破壊することなくオブジェクトの内部状態をキャプチャし、オブジェクトの外側にこの状態を保存します。このようにして、オブジェクトは後で元の保存状態に復元できます。
2。モデルの例
1モード分析
このモードを説明するために、レベルスルーゲームを借りました。
2メモモード静的クラス図
3コードの例(ブラックボックスメモモード)
3.1メモの狭いインターフェイスinarrowmementoを作成します
パッケージcom.demo.memento;/** *覚書狭いインターフェイス(メソッドが提供されていません、外部オブジェクトは覚書オブジェクトの内部情報にアクセスできません)
3.2メモスポンサーヒーロー
パッケージcom.demo.originator; import java.util.random; import com.demo.memento.inarrowmemento;/** * Challenger * * @author * */public class Hero {// Blood Value Private Int Blood; // Private Int Swordを強制します。 //乱数プライベート最終ランダム= new Random(); //構築方法コンテンツを初期化しますpublichero(){this.blood = 100; this.sword = 100; } //覚書を作成してコンテンツを保存するpublic inarrowmemento creatememento(){system.out.println( "Create Memorandum ...");新しい記念品(this.blood、this.sword)を返します。 } //覚書コンテンツを復元する公開void restorefrommenemento(inarrowmemento memento){system.out.println( "覚書のステータスを復元..."); if(memento!= null){memento memento2 =(memento)memento; this.blood = memento2.getBlood(); this.sword = memento2.getsword(); }} / ** * Challenge Boss * / public int koboss(){//血液値が<= 0の場合、課題は失敗します。ボスを倒す確率が2%//判断するとき、(this.blood <= 0 || this.sword <= 0){system.out.println(this.tostring()); System.out.println( "ボスが失敗した!"を変更! "); return -1; } else {//乱数を取得しますdouble win = math.random(); if(win <= 0.02){system.out.println(this.toString()); System.out.println( "おめでとう、上司に成功して挑戦してください!");返品1; } else {system.out.println(this.toString()); System.out.println( "ボスを攻撃し続けます..."); //乱数は血液値と力の値を減らしてko int blood_sub = random.nextint(10)を継続します。 int sword_sub = random.nextint(10); this.blood - = blood_sub; this.sword - = shord_sub; 0を返します。 }}} @Override public string toString(){return "current blood value:" + this.blood + " - 現在の力値:" + this.sword; } / ** *覚書(クラス全体がプライベートで、イニシエーターによってのみアクセスできます) //フォースバリュープライベートファイナルインターソード。 //コンストラクターの初期化コンテンツプライベートメメント(int blood、int sword){this.blood = blood; this.sword = sword; } private int getBlood(){return blood; } private int getSword(){return Sword; }}}3.3覚書マネージャー - 世話人
パッケージcom.demo.caretaker; Import com.demo.memento.inarrowmemento;/** * administrator * * @author * */public class Caretaker {private inarrowmemento memento; / ** *覚書オブジェクトを取得 * * @return */ public inarrowmemento getMemento(){return memento; } / ** *覚書オブジェクトを保存 * * @param memento * / public void setMemento(inarrowmemento memento){this.memento = memento; }}3.4ヒーローにボスワンクライアントに挑戦させます
パッケージcom.demo; import com.demo.caretaker.caretaker; Import com.demo.originator.hero;/** *クライアントメインアプリケーション * * @author * */public class client {/** * @param args */public static void main(string [] args){//役割ヒーロー=新しいヒーロー( //管理者のCARETAKER CARETAKERを作成= new Caretaker(); //チャレンジの前にステータス情報を保存するCaretaker.setMemento(hero.creatememento()); // Boss int cnt = 1を倒す可能性は3つしかありません。 //チャレンジボス結果int ko = -1; while(ko!= 1 && cnt <= 3){system.out .println( "=================" + cnt + "challenge ===================================================================================================================== ===================================================================================================================== {ko == -1){caltaker.getmemento() }}}4ランニング結果
メモを作成します...
=========================================================
現在の血液値:100-現在の力値:100
上司を攻撃し続けます...
現在の血液値:96-現在の力価値:99
上司を攻撃し続けます...
現在の血液値:90-現在の力価値:98
上司を攻撃し続けます...
現在の血液値:81-現在の力価値:95
上司を攻撃し続けます...
現在の血液値:78-現在の力価値:93
上司を攻撃し続けます...
現在の血液値:72-現在の力価値:88
上司を攻撃し続けます...
現在の血液値:64-現在の力価値:85
上司を攻撃し続けます...
現在の血液値:56-現在の力値:80
上司を攻撃し続けます...
現在の血液値:49-現在の力価値:73
上司を攻撃し続けます...
現在の血液値:45-現在の力価値:71
上司を攻撃し続けます...
現在の血液値:37-現在の力価値:68
上司を攻撃し続けます...
現在の血液値:29-現在の力価値:65
上司を攻撃し続けます...
現在の血液値:20-現在の力価値:59
上司を攻撃し続けます...
現在の血液値:11-現在の力価値:54
上司を攻撃し続けます...
現在の血液値:9-現在の力値:52
上司を攻撃し続けます...
現在の血液値:3-電流力値:45
上司を攻撃し続けます...
現在の血液値:-3-現在の力値:41
上司に挑戦することに失敗しました!
メモのステータスを復元します...
=================== 2番目の挑戦===============
現在の血液値:100-現在の力値:100
上司を攻撃し続けます...
現在の血液値:96-現在の力価値:95
上司を攻撃し続けます...
現在の血液値:96-現在の力価値:91
上司を攻撃し続けます...
現在の血液値:88-現在の力価値:82
上司を攻撃し続けます...
現在の血液値:79-現在の力価値:79
上司を攻撃し続けます...
現在の血液値:76-現在の力値:72
上司を攻撃し続けます...
現在の血液値:73-現在の力価値:70
上司を攻撃し続けます...
現在の血液値:72-現在の力価値:66
上司を攻撃し続けます...
現在の血液値:72-現在の力価値:61
上司を攻撃し続けます...
現在の血液値:72-現在の力価値:58
上司を攻撃し続けます...
現在の血液値:72-現在の力価値:52
上司を攻撃し続けます...
現在の血液値:63-現在の力価値:51
上司を攻撃し続けます...
現在の血液値:62-現在の力価値:50
上司を攻撃し続けます...
現在の血液値:54-現在の力価値:41
上司を攻撃し続けます...
現在の血液値:50-電流力値:39
上司を攻撃し続けます...
現在の血液値:47-現在の力価値:39
上司を攻撃し続けます...
現在の血液値:43-現在の力値:38
上司を攻撃し続けます...
現在の血液値:37-現在の力価値:36
上司を攻撃し続けます...
現在の血液値:34-現在の力価値:35
上司を攻撃し続けます...
現在の血液値:32-現在の力価値:27
上司を攻撃し続けます...
現在の血液値:28-現在の力価値:22
上司を攻撃し続けます...
現在の血液値:26-現在の力値:15
上司を攻撃し続けます...
現在の血液値:24-現在の力価値:11
上司を攻撃し続けます...
現在の血液値:19-現在の力値:3
上司を攻撃し続けます...
現在の血液値:10-現在の力値:-3
上司に挑戦することに失敗しました!
メモのステータスを復元します...
================== 3番目の課題==================
現在の血液値:100-現在の力値:100
上司を攻撃し続けます...
現在の血液値:99-現在の力価値:93
上司を攻撃し続けます...
現在の血液値:98-現在の力価値:84
上司を攻撃し続けます...
現在の血液値:98-現在の力値:82
上司を攻撃し続けます...
現在の血液値:95-現在の力価値:76
上司を攻撃し続けます...
現在の血液値:88-現在の力価値:68
上司を攻撃し続けます...
現在の血液値:81-現在の力価値:64
上司を攻撃し続けます...
現在の血液値:76-現在の力価値:64
上司を攻撃し続けます...
現在の血液値:67-現在の力値:64
おめでとうございます、あなたは上司に挑戦しました!
iii。このパターンの設計原則
1。パッケージの境界を維持します
2セキュリティを確保するためのデュアルインターフェイスの実装。
4.機会を使用します
1特定の瞬間にオブジェクトの以前の状態を復元する必要がある場合。
2。ホワイトボックスメモモードでは、特定の瞬間に外部からオブジェクトの状態を保存する必要がありますが、インターフェイスを使用して他のオブジェクトがこれらの状態を直接取得できるようにする場合、オブジェクトの実装の詳細を公開し、オブジェクトのカプセル化を破壊します。
3ブラックボックスメモモードの実装は、デュアルインターフェイスアクセスメカニズムを提供し、イニシエーターオブジェクトに幅広いインターフェイスを提供し、イニシエーター以外のオブジェクトに狭いインターフェイスを提供するため、カプセル化とセキュリティを効果的に解決します。
V.静的クラス図
1つのホワイトボックスメモモード静的クラス図
2ブラックボックスメモモード静的クラス図
Java関連のコンテンツについては、このサイトに興味のある読者は、「Javaデータ構造とアルゴリズムのチュートリアル」、「Java操作DOMノードのヒントの概要」、「Javaファイルの要約およびディレクトリ操作のヒント」、「Java Cache操作のヒントの要約」というトピックを見ることができます。
この記事がみんなのJavaプログラミングに役立つことを願っています。