Facade、Proxy、Adapter、Decoratorのデザインパターンの違いは何ですか?
私は明確な説明を読んだことがありません、あなたは何ですか?
Facade、Proxy、Adapter、Decoratorのデザインパターンの違いは何ですか?
私は明確な説明を読んだことがありません、あなたは何ですか?
回答:
アダプターは、指定されたクラス/オブジェクトを新しいインターフェースに適合させます。前者の場合、多重継承が通常使用されます。後者の場合、オブジェクトは適合アダプタオブジェクトによってラップされ、渡されます。ここで解決している問題は、互換性のないインターフェースの問題ですです。
Facadeは、複雑な機能セットへの単純なゲートウェイのようなものです。クライアントが気にする必要のないブラックボックスを作成します。つまり、インターフェースをシンプルにします。。
プロキシは、プロキシ対象のクラスと同じインターフェースを提供し、通常、独自のハウスキーピング機能を実行します。(したがって、重いオブジェクトの複数のコピーを作成する代わりにX
、軽量プロキシのコピーを作成します。P
これにより、X
必要に応じて呼び出しが管理および変換されます。)クライアントは、重いオブジェクトや複雑なオブジェクトを管理する必要がないという問題を解決しています。。
デコレーターは、オブジェクトに火薬を追加するために使用されます(オブジェクトという用語に注意してください。通常、オブジェクトは実行時に動的に装飾されます)。オブジェクトの既存のインターフェースを非表示/損なわず、実行時にそれを拡張するだけ。
これでデコレータが関係するようになったので、なぜオブジェクトという単語に重点を置いているのかを知りたいと思うでしょう-一部の言語(Javaなど)は、仮想継承(つまり、C ++のように多重継承)を許可していないため、コンパイル時間。
複数の継承(そして恐ろしいひし形)をドラッグしたので、ミックスインを探します。これは、複数の継承の問題を回避するためにインターフェースの線形連鎖が順序付けられています。しかし、ミックスインはそれをうまくミックスしません。そして、最終的にはトレイトができます -はい、C ++のテンプレートパラメーターで常にポップアップが表示される、ステートレスな動作の小さな塊です。トレイトは、複数の継承や順序付けされたチェーニングを行わずに、動作の構成と分解の問題にエレガントな方法で対処しようとします。
ファサード
たとえば、ファサードを使用すると、APIの呼び出しが簡単になります。これを見てくださいリモートファサードの例を。ここでの考え方は、サーバー上のコードの完全な実装がクライアントから隠されているということです。クライアントは1つのAPIメソッドを呼び出し、次にサーバーで1つ以上のAPI呼び出しを行うことができます。
アダプタ
これの良い例は、ウィキペディアのこちらにあります。クライアントオブジェクトSource
が別のオブジェクトのメソッドを呼び出したいのですTarget
が、その他のオブジェクトのインターフェースは、クライアントが期待しているものとは異なります。
アダプタオブジェクトを入力します。
Source
オブジェクトからの呼び出しを受け取り、舞台裏で、Target
使用するメソッドを呼び出すことができます。
Source->CallMethodAOnTarget() ---< Adaptor.CallMethodAOnTarget() this calls ---> Target.MethodWithDifferentSignatureAndName(int i)
プロキシに関しては、このデザインパターンの経験はありません。