1. ホーム
  2. design-patterns

[解決済み】Proxy、Decorator、Adapter、Bridgeの各パターンの違いとは?

2022-03-24 10:19:24

質問

Proxyパターンを見ていて、Decorator、Adapter、Bridgeパターンに酷似しているように思います。私は何かを誤解しているのだろうか?何が違うのでしょうか?なぜProxyパターンと他のパターンを使い分けるのでしょうか?実際のプロジェクトでは、過去にどのように使用したことがありますか?

どのように解決するのですか?

Proxy、Decorator、Adapter、Bridgeはすべて、クラスをquot;wrapping"するバリエーションです。 しかし、その使い方はさまざまです。

  • プロキシ は、オブジェクトのインスタンス化を怠ったり、 リモートサービスを呼び出していることを隠したり、 オブジェクトへのアクセスを制御したりしたい場合に使用します。

  • デコレーター は、スマートプロキシとも呼ばれます。これは、あるオブジェクトに機能を追加したいが、そのオブジェクトの型を拡張する必要はない場合に使用します。 これにより、実行時に機能を追加することができます。

  • アダプタ は、抽象的なインターフェースがあり、そのインターフェースを、似たような機能的役割を持ちながら、異なるインターフェースを持つ別のオブジェクトにマッピングしたい場合に使用します。

  • ブリッジ はAdapterと非常に似ていますが、抽象的なインターフェースと基盤となる実装の両方を定義することをBridgeと呼んでいます。 つまり、レガシーやサードパーティのコードに適応するのではなく、すべてのコードの設計者でありながら、異なる実装を交換できる必要があるのです。

  • ファサード は、1つまたは複数のクラスのサブシステムに対する、より上位の(より単純な)インターフェイスである。例えば、複数のオブジェクトを必要とする複雑な概念を表現するとします。このようなオブジェクトの集合に変更を加えると、どのオブジェクトが呼び出すべきメソッドを持っているのかが常に分からないため、混乱します。そんなときこそ、オブジェクトの集合体に対して行える複雑な操作のための高レベルなメソッドを提供するFacadeを書けばいいのだ。例:学校のセクションのためのドメインモデルで、以下のようなメソッドを持つ。 countStudents() , reportAttendance() , assignSubstituteTeacher() といった具合です。