1

Proxy - ProxyService を RealService 呼び出しに変換するコード (および場所) は? なぜ/いつこれを使用するのですか? レイヤー - 実装方法は? Memento - 状態をキャッシュやファイルに保存しないのはなぜですか?

Proxyパターンについての私の理解では、 concretionsとconcretions を備えたある種のServiceインターフェースがあるということです。何らかの理由で にアクセスできないため、インスタンスに対してコーディングし、フレームワークがプロキシをサービスの実際のインスタンスにリンクできるようにします。2 つの問題のみ:ProxyServiceRealServiceRealServiceProxyService

  • Serviceとにアクセスできるときの例は 1 つも思いつきませんが、そうではありProxyServiceませRealServiceん。

これはMementoパターンとどう違うのですか? Memento の定義についての私の理解では、オブジェクトの状態を保存するために使用されるということです。これは、プロキシが実際に行っていることです。そうでない場合は、Memento と Proxy の違いを説明してください。前もって感謝します!

4

2 に答える 2

2

プロキシとは、誰かが特定のオブジェクトを期待していて、その人に嘘をつき、次のように言うときです: はい、ここにオブジェクトがありますが、実際には彼に何か他のものを与えています... プロキシの一般的な使用法: 遅延初期化を実装するには:大きなファイルの内容を表すオブジェクト、または取得するのに非常に費用がかかるものを求められますが、現時点では必要ないか、実際にはまったく使用されない可能性があることがわかっています。そのため、100% 完全に必要な場合にのみリソースを取得するプロキシを渡します (リソースの取得を時代錯誤的に開始し、プロキシを使用するプロセスが本当に必要な場合にのみ待機を開始するようにすることもできます)。これは ORM ではよくあることです。また、先物と約束このようなものを実装して呼び出しをインターセプトするには:実際のオブジェクトを実際に認識しているプロキシを渡し、取得した呼び出しをインターセプトし、それらをログに記録したり、それらの一部を変更したりするなどの興味深いことを行うことができます...他にもたくさんあります多くの場合、実行時に動作を決定できることを考えると、プロキシの高度で複雑な使用法について説明します。Java から離れて申し訳ありませんが、C# では、Castle Proxy を使用してテスト用のモック オブジェクトを実装します。アンダースコアで連鎖するようなプロキシを実装することもできます. また、プロキシを使用して、静的言語で多くの「動的言語」機能をシミュレートできます。また、実行されるすべての呼び出しを実際にログに記録し、毎回新しいプロキシを返すプロキシを使用してコードを評価し、実行するだけで「元のソース コード」を再構築することもできます。

メメント柄:全く別物です。オブジェクトを操作し、現在の状態を保存し、そのオブジェクトの実行を数え、しばらくしてから前の状態にロールバックすることを選択する場合に使用します。コードで元に戻すのが難しい場合に、オブジェクトにトランザクション動作を実装するために使用できます。これにより、取り消しとやり直し機能を実装できます。(変更デルタを保存する代わりに、完全な状態を保存します)。シミュレーションでそれを使用して、毎回同じポイントから開始することができます (ソース バージョン サーバーは時々 memento を使用すると言えます [通常、memento + デルタ変更の組み合わせを使用します])。仮想マシンのスナップショットまたはコンピューターの休止状態も memento パターンの使用法です。何かの状態を保存し、

于 2012-07-09T23:12:39.417 に答える
2

まず最初に、パターンについて厳格な規則があるとは思わないということで、私の答えを警告します。パターンから必要なものを取得するだけです。私が特定のパターンを使用する方法は、他の開発者がそれらを使用する方法とは明らかに異なります。とはいえ、これがあなたの質問に対する私の見解です。

プロキシ パターンの説明

私がデザインパターンを知っている方法ではProxy、それを使用して2つのことを行います。

  1. 特定のオブジェクト インスタンスのパブリック メソッドへのアクセスを制限する
  2. プロキシへの最初の呼び出しで具体的なオブジェクトをインスタンス化し、プロキシで作成された具体的なインスタンスにプロキシでの以降のすべての呼び出しを渡すことにより、そうでなければ高価で不必要なインスタンス化のコストを防ぎます。

隠したいRealServiceメソッドがあるかもしれません。doSomethingReallyDangerous()または、さらに無害なことに、インスタンスの変数名の後にRealServiceを入力するたびに表示する必要のない数百のメソッドがある可能性があります。これにはプロキシを使用します。.RealService

さらに読むために、この記事には多くの優れた情報があります。

http://sourcemaking.com/design_patterns/proxy

メメントパターンとの違い

このMementoパターンを使用すると、具体的なオブジェクトと一緒に中間状態を保存することで、オブジェクトを元の状態または以前の状態にロールバックできます。プログラミングの「元に戻す」のようなものです。おそらくProxyパターンを使用して を実装しますMementoProxy、オブジェクトの状態の保存またはロールバックを保証するものではありません。オブジェクトを再度インスタンス化するのが非常に高価な場合に、メソッド呼び出しで同じオブジェクトを参照できるようにするだけです。

うまくいけば、Mementoそれが のより完全な機能を備えたバージョンと考えるのが好きですProxyが、すべてのProxy実装がMementos.

于 2012-07-09T23:12:46.427 に答える