web-dev-qa-db-ja.com

ファサード、プロキシ、アダプター、デコレーターのデザインパターンの違いは?

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

明確な説明を読んだことがありません、あなたは何ですか?

122
user310291

Adapterは、指定されたクラス/オブジェクトを新しいインターフェイスに適合させます。前者の場合、通常、多重継承が使用されます。後者の場合、オブジェクトは適合アダプタオブジェクトによってラップされ、渡されます。ここで解決しようとしている問題は、非互換インターフェースの問題です。

Facadeは、複雑な機能セットへの単純なゲートウェイに似ています。クライアントの心配を減らすためにブラックボックスを作成します。つまり、インターフェースをよりシンプルにします

Proxyは、proxied-forクラスと同じインターフェースを提供し、通常はいくつかのハウスキーピング処理を独自に行います。 (したがって、重いオブジェクトXの複数のコピーを作成する代わりに、軽量プロキシPのコピーを作成し、次にXを管理し、必要に応じて呼び出しを変換します。)クライアントの問題を、重いオブジェクトや複雑なオブジェクトを管理する必要があることから解決します

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

デコレータが関係するようになったので、おそらくWordオブジェクトに重点を置いている理由を知りたくなるでしょう-一部の言語(Javaなど)では、仮想継承(つまり、C++のように多重継承)を許可しないため、コンパイル時間。

複数の継承(および恐ろしいダイアモンド)をドラッグしたため、mixins-を探します多重継承の問題を回避するために、インターフェースの順序付き線形連鎖ただし、ミックスインではうまくミックスできません。そして、最終的にはtraits-はい、それら行動のステートレスな小さな塊C++のテンプレートパラメータに常にポップアップが表示されること。特性は、複数の継承または順序付けされた連鎖のいずれにも進まずに、エレガントな方法で動作の構成と分解の問題に対処しようとします。

268
dirkgently

ファサード

たとえば、ファサードを使用して、APIの呼び出しを簡単にすることができます。 this リモートファサードの例を見てください。ここでの考え方は、サーバー上のコードの完全な実装がクライアントから隠されているということです。クライアントは1つのAPIメソッドを呼び出します。これにより、サーバー上で1つ以上のAPI呼び出しを行うことができます。

アダプター

この良い例は、ウィキペディアで here にあります。クライアントオブジェクトSourceは別のオブジェクトTargetのメソッドを呼び出したいが、その他のオブジェクトのインターフェースはクライアントが期待しているものとは異なる。

アダプタオブジェクトを入力します。

Sourceオブジェクトから呼び出しを取り、舞台裏で、使用すべきTargetメソッドを呼び出します。

Source->CallMethodAOnTarget() ---< Adaptor.CallMethodAOnTarget() this calls ---> Target.MethodWithDifferentSignatureAndName(int i)

プロキシに関しては、このデザインパターンの経験はありません。

16
Jason Evans