1. ホーム
  2. design-patterns

[解決済み] Facade、Proxy、Adapter、Decoratorのデザインパターンの違い?

2022-04-27 21:01:23

質問

の違いは何ですか? ファサード , プロキシ , アダプタ および デコレーター デザインパターン

一般的な視点から見ると、このようなパターンは同じことをやっているように見える、つまり。 APIをラップし、それへのアクセスを提供する .

これらのパターンをどのように見分けるか?

あるパターンが他のパターンよりも適している場合の見分け方とは?

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

アダプタ は、与えられたクラス/オブジェクトを新しいインターフェイスに適合させます。前者の場合、一般に多重継承が採用される。後者の場合、オブジェクトは適合するアダプタ・オブジェクトにラップされ、受け渡される。ここで解決しようとしている問題は 非互換インターフェース .

ファサード は、複雑な機能のセットへの単純なゲートウェイのようなものです。クライアントが心配しないように、ブラックボックスを作るのです。 インターフェイスをよりシンプルにする .

プロキシ はプロキシされるクラスと同じインターフェイスを提供し、一般的にそれ自身でいくつかのハウスキーピングを行います。(つまり、重いオブジェクトの複数のコピーを作成する代わりに X のコピーを作成し、軽量なプロキシ P を管理し、さらに X で、必要に応じて呼び出しを翻訳します)。クライアントの問題を解決しています。 重い、あるいは複雑なオブジェクトを管理する .

デコレーター は、オブジェクトに火薬を追加するために使用します (オブジェクトという用語に注意してください -- 通常、実行時に動的にオブジェクトを装飾します)。オブジェクトの既存のインターフェイスを隠したり損なったりはしませんが 単に実行時に拡張する .

Javaなどの言語では、仮想継承(C++のような多重継承)ができないため、コンパイル時に仮想継承を実現することができません。

多重継承(と恐ろしい菱形)を引きずっているので、次のようなものに注意する必要があります。 ミックスイン -- それは インターフェースの順序付き線形連鎖 を使用して多重継承の問題を回避しています。しかし、ミキシンはそれほどうまく混ざらない。そして、最終的には 特性 -- そう、これらの 行動の無国籍な小さな塊 C++のテンプレート・パラメータでよく目にするものです。Traitsは、振る舞いの合成と分解という問題を、エレガントに解決しようとするもので、多重継承や順序付き連鎖を目指すものではありません。