Facade、Proxy、Adapter、およびDecoratorデザイン パターンの違いは何ですか?
一般的な観点からは、このようなパターンは同じことを行うように見えます。つまり、API をラップしてアクセスを提供します。
これらのパターンをどのように区別しますか?
あるパターンが他のパターンよりも適している場合をどのように見分けるのですか?
Facade、Proxy、Adapter、およびDecoratorデザイン パターンの違いは何ですか?
一般的な観点からは、このようなパターンは同じことを行うように見えます。つまり、API をラップしてアクセスを提供します。
これらのパターンをどのように区別しますか?
あるパターンが他のパターンよりも適している場合をどのように見分けるのですか?
アダプターは、特定のクラス/オブジェクトを新しいインターフェイスに適応させます。前者の場合、通常は多重継承が使用されます。後者の場合、オブジェクトは適合するアダプター オブジェクトによってラップされ、渡されます。ここで解決している問題は、互換性のないインターフェースの問題です。
ファサードは、複雑な機能セットへの単純なゲートウェイのようなものです。クライアントの心配を軽減するためのブラックボックスを作成します。つまり、インターフェイスをよりシンプルにします。
Proxyは、proxyed-for クラスと同じインターフェースを提供し、通常、いくつかのハウスキーピングを独自に行います。(したがって、重いオブジェクトの複数のコピーを作成する代わりに、必要に応じて呼び出しを管理および変換X
する軽量プロキシのコピーを作成します。)クライアントが重いオブジェクトや複雑なオブジェクトを管理しなければならないという問題を解決しています。P
X
デコレーターは、オブジェクトにさらに火薬を追加するために使用されます (オブジェクトという用語に注意してください。通常、実行時にオブジェクトを動的に装飾します)。オブジェクトの既存のインターフェースを非表示にしたり損なわせたりするのではなく、実行時に拡張するだけです。
デコレータが関係するようになったので、オブジェクトという言葉が強調されている理由を知りたいと思うでしょう。一部の言語 (Java など) では、これを実現するために仮想継承 (つまり、C++ のような多重継承) が許可されていません。コンパイル時間。
多重継承 (と恐ろしいひし形) を引きずり込んだので、多重継承の問題を回避するためにインターフェイスの順序付けられた線形連鎖であるmixinに注意してください。ただし、ミックスインはそれほどうまく混合しません。そして、最終的にトレイトになります。そうです、C++ のテンプレート パラメーターで常にポップアップ表示されるステートレスな動作の小さな塊です。トレイトは、複数の継承や順序付けられた連鎖のいずれにも対応せずに、洗練された方法で動作の構成と分解の問題に対処しようとします。
ファサード
たとえば、ファサードを使用して、API の呼び出しを簡単にすることができます。このリモート ファサードの例を見てみましょう。ここでの考え方は、サーバー上のコードの完全な実装がクライアントから隠されているということです。クライアントは 1 つの API メソッドを呼び出します。このメソッドは、サーバー上で 1 つ以上の API 呼び出しを行うことができます。
アダプタ
この良い例は、ウィキペディアのここにあります。クライアント オブジェクトSource
は別のオブジェクトのメソッドを呼び出したいと考えてTarget
いますが、そのオブジェクトのインターフェイスはクライアントが期待しているものとは異なります。
アダプタ オブジェクトを入力します。
オブジェクトからの呼び出しを受け取りSource
、バックグラウンドで、Target
使用する必要があるメソッドを呼び出すことができます。
Source->CallMethodAOnTarget() ---< Adaptor.CallMethodAOnTarget() this calls ---> Target.MethodWithDifferentSignatureAndName(int i)
Proxy に関しては、私はこのデザイン パターンの経験がありません。