アダプタパターンとプロキシパターンの違いは?


33

理解する限りでは、アダプターパターンは、目的の実際のオブジェクトのラッパーオブジェクトを作成しています。これは、もう1つのレベルの間接化であり、柔軟性を提供します。柔軟性は、実際のオブジェクトのインターフェイスが変更された場合、実際のオブジェクトを指すラッパーインターフェイスを変更し、クライアント側の公開インターフェイスを変更しないという点です。

Proxyパターンは、すべてのプロキシラッパーは実際のオブジェクトの機能の唯一のコヒーレントサブセットを提供していることの違いで、同じです。「1つの目的のために1つのクラス」を作成しようとするとき、なぜこれが役立つのかは私にはわかりません。

これを正しく入手しましたか?

回答:


55

完全ではありません。

アダプタパターンの主な目的は、クラス/ライブラリAのインターフェイスをクライアントBの期待に変更することです。典型的な実装は、ラッパークラスまたはクラスのセットです。目的は、将来のインターフェースの変更を容易にすることではなく、現在のインターフェースの非互換性です。

Proxyパターンはまた、ラッパークラスを使用しますが、異なる目的のために。プロキシパターンの目的は、実際のリソースの代役を作成することです。プロキシを使用する理由は

  • 実際のリソースはリモートコンピューターに存在します(プロキシはリモートリソースとの対話を容易にします)
  • 実際のリソースは作成に費用がかかります(プロキシは、本当に必要でない限り、コストが発生しないことを保証します)

最も重要なことは、プロキシが、それが代用される実際のリソースのドロップイン置換を提供するため、同じインターフェースを提供する必要があるということです。


まず第一に、素晴らしい答えをありがとう。プロキシは、現在のクライアントが必要とするすべてのインターフェースを実装していますか、それとも実際のリソースが提供するすべてのインターフェースを実装していますか?
ヴォラック

1
@Vorac:それはインターフェースの複雑さとデザイン哲学に依存します。どちらも可能ですが、インターフェースが大きい/複雑な場合、またはYAGNIを強く信じている場合は、必要なものだけを実装する方が理にかなっています。
バートヴァンインゲンシェナウ

それでは、アダプタパターンがラッパークラスを使用している場合、アダプタパターンはプロキシパターンですか?
moonman239

@ moonman239:いいえ、ラッパークラスを使用する意図が異なるためです。クラス図で2つのパターンが似ているからといって、それらが相互に関連または実装していることを意味するわけではありません。パターンが異なる主な要因は、その意図です。
バートヴァンインゲンシェ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.