私は両方の定義を読んでいますが、それらはまったく同じように見えます。誰かが彼らの違いは何であるかを指摘できますか?
ありがとう
私は両方の定義を読んでいますが、それらはまったく同じように見えます。誰かが彼らの違いは何であるかを指摘できますか?
ありがとう
ファサードパターンのwikiページには、これに関する簡単なメモがあります。
「アダプタは、ラッパーが特定のインターフェイスを尊重し、ポリモーフィックな動作をサポートする必要がある場合に使用されます。一方、ファサードは、より簡単または単純なインターフェイスを使用したい場合に使用されます。」
さまざまなステレオシステムすべてで動作するように設定したユニバーサルリモコンについて考える必要があるというアナロジーを聞きました。「オン」を押すと、ケーブルボックス、受信機、テレビの電源がオンになります。多分それは本当に豪華なホームシアターであり、それは明かりを暗くし、色合いも描きます。これはファサードです。より複雑な一連の手順を処理する1つのボタン/機能です。
アダプタパターンは、互換性のない2つのインターフェイスをリンクするだけです。
編集:(コメントに基づく)アダプタパターンの簡単な例えは、DVIからVGAへのアダプタのようなものかもしれません。最近のビデオカードは多くの場合DVIですが、古いVGAモニターがあります。ビデオカードの予想されるDVI入力に接続し、独自のVGA入力を備えたアダプタを使用すると、古いモニターを新しいビデオカードで動作させることができます。
アダプター == 丸い穴に四角いペグをはめ込みます。
Facade == すべての内部コンポーネントを実行する単一のコントロール パネル。
ファサード:
重要なポイント: ( pankaj Kumar によるジャーナル開発の記事から)
ファサード クラス図:
アダプタ:
アダプターのクラス図:
Adapter の詳細については、次の SE の投稿を参照してください。
主な違い:
理解を深めるために、ソース作成の記事もご覧ください。
正直なところ、多くのパターンをプログラムで同じ方法で実装できます。違いは意図にあります。
アダプター設計パターンは、1 つ以上のクラスのインターフェースを、クライアントが使用することを期待するインターフェースに「変換」することを目的としています。アダプターは、予期されるインターフェースへの呼び出しを、ラップされたクラスが使用する実際のインターフェースに変換します。
ファサード パターンは、より単純なインターフェイスが必要な場合に使用されます (また、問題のあるクラスをラップすることで同じ方法で実装できます)。既存のインターフェイスに互換性がない場合、必要なときにファサードを使用しているとは言いません。読みやすくしたり、デザインの悪さを減らしたりするなど。
ファサードは、単一のサービスゲートウェイの背後で複数のサービスを編成するように設計されています。アダプターは、既知のインターフェースを使用して未知のインターフェースにアクセスする方法を提供するように設計されています。
いつものように、いくつかのパターンの間には類似点があります。しかし、私はそれを次のように見るでしょう:
あまり形式張らずに平易な言葉で説明しようと思います。
いくつかのドメイン クラスがあり、UI からそれらと対話したいとします。ファサードを使用して、UI レイヤーから呼び出すことができる関数を提供できるため、UI レイヤーはファサード以外のドメイン クラスを認識しません。つまり、ドメイン クラスで関数を呼び出す代わりに、必要な関数を他のクラスから呼び出す役割を担うファサードから単一の関数を呼び出します。
一方、アダプターを使用して、必要な機能と同じ機能を持つ可能性がある他の外部コンポーネントを統合することができますが、それらの機能はまったく同じ方法で呼び出されません。ドメインにCar
クラスがあり、Car クラスも定義されている外部の自動車プロバイダーを使用しているとします。このクラスには関数car.getDoors()
がありますが、外部プロバイダーには同等の関数がありますcar.getNumDoors()
。この関数の呼び出し方法を変更したくない場合は、アダプター クラスを使用して外部 Car クラスをラップし、getDoors()
アダプターの呼び出しが外部クラスの に委任されるようにすることができますgetNumDoors()
。
アダプタパターンにより、以前は互換性がなかった2つのインターフェイスを相互に機能させることができます。2つの別々のインターフェースが機能しています。
ファサードパターンは、低レベル/細粒度の既知のインターフェイスを使用し、高レベル/コースグレインのインターフェイスでラップします。別のインターフェイスでラップすることで簡素化された単一のインターフェイスを備えています。
アダプタは、2つのインターフェイスを連携させます。
ファサードは、単一のクラスをより高く、より制限されたレベルに公開します。たとえば、ビューモデルのファサードは、下位レベルのクラスの特定の読み取り専用プロパティのみを公開する場合があります。
アダプター パターンは、新しいインターフェイスを提供することで、互換性のない 2 つのインターフェイスをリンクします。
ファサード パターンは、複雑なサブシステム (複数のコンポーネントを持つ) を単一のインターフェイスで簡素化します。
私は両方の定義を読んでいますが、まったく同じようです。
本当に ?
Adapterという用語が、実際にはStategyとは何かを説明するために使用されることがあることに気付きました。
たとえば、Zend Frameworkでは、すべてのAdapterクラスは実際にはStrategyパターンの実装です。これらのクラスはネイティブ コードをクラスの後ろにラップするだけで、複数の動作を行うことができるからです。
アダプターは、多くの場合、レガシーまたは「古いスタイル」のコードをラップするために使用されます。