Facade、Proxy、Adapter、Decoratorのデザインパターンの違いは何ですか?[閉まっている]


135

Facade、Proxy、Adapter、Decoratorのデザインパターンの違いは何ですか?

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



@gavenkoaもう1つの質問はプロキシとデコレータに関するものだけです
user310291

2
いくつかの閉じた質問が非常に有用であることを明らかにするので、信じられないほどです。
ルーク、

回答:


285

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

Facadeは、複雑な機能セットへの単純なゲートウェイのようなものです。クライアントが気にする必要のないブラックボックスを作成します。つまり、インターフェースをシンプルにします。

プロキシは、プロキシ対象のクラスと同じインターフェースを提供し、通常、独自のハウスキーピング機能を実行します。(したがって、重いオブジェクトの複数のコピーを作成する代わりにX、軽量プロキシのコピーを作成します。Pこれにより、X必要に応じて呼び出しが管理および変換されます。)クライアントは、重いオブジェクトや複雑なオブジェクト管理する必要がないという問題を解決しています。

デコレーターは、オブジェクトに火薬を追加するために使用されます(オブジェクトという用語に注意してください。通常、オブジェクトは実行時に動的に装飾されます)。オブジェクトの既存のインターフェースを非表示/損なわず、実行時にそれを拡張するだけ

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

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


1
HTH!漠然としすぎないように出来るだけ入れてみました。上手くやれないことをすみません。私は特性に関する(PhD論文)論文だけを読みました。したがって、私の知識はかなり限られており、私はこのスペースのすべてのパターンに適合するには十分ではありません;)
10

あなたはミックスインと特性に関する将来の質問を予想しましたが、私はまだそれらを見ていません!
user310291 2010

1
最初の3つ(Decoratorはまったく異なる)の(ウィキペディア経由の)優れた比較リンク: NetObjectives
Liviu

@Liviuあなたのリンクは死んでいます。あなたはもともとそこを指していたと思いますが、コンテンツは現在ログインの背後にあるようです。
ジョナサンH

@Sheljohnリンクが更新されました:p:最初の3つ(Decoratorはかなり異なります)の(Wikipediaを介した)優れた比較リンクNetObjectives(テキストの取得、「betweem」を参照してください)アダプタ、プロキシ、ファサードの違いは何ですか?それらは本当に私には同じように見えます。)
Liviu

16

ファサード

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

アダプタ

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

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

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

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

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

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