メモモード、通訳モード

覚書(メネント)モード

定義:カプセル化を破棄しないことを前提として、オブジェクトの内部状態をキャプチャし、この状態をオブジェクトの外部に保存して、将来必要になったときにオブジェクトを元の状態に復元できるようにします。このモードは、スナップショットモードとも呼ばれます。

長所と短所

利点:

  1. ステータスを復元するためのメカニズムを提供しますユーザーは、必要に応じてデータを特定の履歴状態に簡単に復元できます。
  2. 内部状態のカプセル化が実現されます。それを作成したイニシエーター以外のオブジェクトは、この状態情報にアクセスできません。
  3. 簡略化された開始人間イニシエーターは、内部状態の個々のバックアップを管理および保存する必要はありません。すべての状態情報はメモに保存され、管理者によって管理されます。これは、単一責任の原則に準拠しています。

短所:リソースの消費量が多い保存する内部状態情報が多すぎるか非常に頻繁である場合、比較的大きなメモリリソースを消費します。

アプリケーションシナリオ

  1. データシーンを保存および復元する必要があります例:ゲームをプレイするときの中間結果の保存機能。
  2. 操作をロールバックできるシナリオを提供する必要があります

主人公

  1. 発信者の役割:現在の内部状態情報を記録し、メモの作成やメモデータの復元などの機能を提供し、その他のビジネス機能を実現します。メモ内のすべての情報にアクセスできます。
  2. Memento(Memento)の役割:イニシエーターの内部状態を保存し、必要に応じてこれらの内部状態をイニシエーターに提供します。
  3. マネージャー(Caretaker)の役割:メモを管理し、メモを保存および取得する機能を提供しますが、メモの内容にアクセスして変更することはできません。

構造図

ここに画像の説明を挿入します

覚書の例

メモモードを使用して、「ブラインドデートゲーム」をデザインします。あなたの恋人として4つの美しさの1つを選んでください。あなたが満足していないならば、あなたはそれを取り消すことができます。構造図は次のとおりです。
ここに画像の説明を挿入します

パターンの拡大

メモモードはプロトタイプモードと組み合わせることができます。プロトタイプモードのclone()メソッドには自動バックアップ機能がありますので、イニシエーターがCloneableインターフェースを実装して自分自身をバックアップする機能を持たせれば、メモクラスを削除することができます。構造図は次のとおりです。
ここに画像の説明を挿入します

通訳モード(一般的には使用されません)

定義:分析オブジェクトの言語を定義し、その言語の文法表現を定義してから、その言語の文を解釈するパーサーを設計します。つまり、コンパイルされた言語を使用して、アプリケーションの例を分析します。

長所と短所

利点:

  1. 優れたスケーラビリティクラスは言語の文法規則を表すためにインタープリターモードで使用されるため、継承などのメカニズムを介して文法を変更または拡張できます
  2. 実装が簡単構文ツリーの各式ノードクラスは類似しているため、その文法を実装する方が簡単です。

短所:

  1. 実行効率が低いインタプリタモードは通常、多くのループと再帰呼び出しを使用します。説明する文がより複雑になると、その実行速度は非常に遅くなり、コードのデバッグプロセスもより面倒になります。
  2. クラス拡張が発生します。インタプリタモードの各ルールは、少なくとも1つのクラスを定義する必要があります。文法ルールが多数含まれていると、クラスの数が急激に増加し、システムの管理と保守が困難になります。
  3. 適用可能なシナリオは比較的少ないです。ソフトウェア開発では、言語文法を定義する必要のあるアプリケーション例が非常に少ないため、このモードが使用されることはめったにありません。

アプリケーションシナリオ

  1. 言語の文法が比較的単純で、実行効率が重要な問題ではない場合。
  2. 問題が再発し、簡単な言語で表現できる場合。
  3. 言語を解釈して実行する必要があり、その言語の文を次のような抽象構文木として表現できる場合:XMLドキュメントの解釈。

パターンの構造と実現

文法:言語の文法構造を説明するために使用される正式な規則です。たとえば、中国語の「文」の文法:
<sentence> :: = <subject> <predicate> <object>
<subject> :: = <pronoun> | <noun>
<predicate> :: = <verb>
<オブジェクト> :: = <名詞> | <名詞> <名詞>
:: =あなた|私|彼
<名詞> :: =大学生|英語
<動詞> :: =はい|研究
ノート:ここの記号 ":: = "「定義する」の意味を示します。非終端記号は"> "と" <"でハングし、終端記号はハングしません。

:言語の基本単位であり、言語セットの要素であり、「文法」から派生できる終端記号と非終端記号で構成されます。たとえば、上記の文法は「私は大学生です」と推測できるので、文です。

文法ツリー:文構造のツリー表現であり、文プッシュの結果を表します。文の文法構造のレベルを理解するのに役立ちます。下の図は「私は大学生です」の文法ツリーです。
ここに画像の説明を挿入します

主人公

  1. 抽象表現(AbstractExpression)の役割:インタープリターのインターフェースを定義し、インタープリターの解釈操作に同意し、主に解釈メソッドinterpret()を含みます。
  2. 終端記号(TerminalExpression)の役割:これは抽象表現のサブクラスであり、文法の終端記号に関連する操作を実装するために使用されます。文法の各終端記号には、それに対応する特定の中間式があります。
  3. 非終端式(NonterminalExpression)の役割:これは抽象式のサブクラスでもあり、文法の非終端記号に関連する操作を実装するために使用されます。文法の各ルールは非終端式に対応します。
  4. コンテキストロール:通常、各インタープリターに必要なデータまたは共通の機能が含まれ、通常、すべてのインタープリターが共有するデータを転送するために使用され、後続のインタープリターはここからこれらの値を取得できます。
  5. クライアント:主なタスクは、分析する必要のある文または式を、インタプリタオブジェクトによって記述された抽象構文ツリーに置き換えてから、インタプリタの解釈メソッドを呼び出すことです。もちろん、インタプリタの解釈には、を介して間接的にアクセスすることもできます。環境ロールメソッド。

構造図

ここに画像の説明を挿入します

インタープリターパターンの例

バスカードリーダーは乗客の身元を確認できます。「韶関」または「広州」「高齢者、女性、子供」の場合、無料でバスに乗車でき、他の人は2元の旅費が差し引かれます。
文法規則は次のとおりです。
:: =的
:: =韶関|広州
:: =高齢者|女性|子供
写真例は次のとおりです。
ここに画像の説明を挿入します

注:「ソフトウェアデザインパターン(Javaバージョン)」で選んだ記事の内容、著者:チェンファインコラム

おすすめ

転載: blog.csdn.net/weixin_44048668/article/details/111106533
おすすめ