私は両方の定義を読んでいますが、まったく同じように見えます。誰が彼らの違いは何かを指摘できますか?
ありがとう
Facade Pattern wikiページには、これに関する簡単なメモがあります。
「アダプタは、ラッパーが特定のインターフェイスを尊重し、多態的な動作をサポートする必要がある場合に使用されます。一方、ファサードは、より簡単またはシンプルなインターフェイスを使用したい場合に使用されます。」
さまざまなステレオシステムで動作するように設定したユニバーサルリモートコントロールについて考える必要があるというアナロジーを聞きました。「オン」を押すと、ケーブルボックス、レシーバー、テレビがオンになります。たぶんそれは本当に派手なホームシアターで、明かりを暗くして日陰も描きます。それはファサードです-より複雑な一連のステップを処理する1つのボタン/機能。
アダプタパターンは、2つの互換性のないインターフェイスをリンクするだけです。
EDIT:(コメントに基づく)アダプタパターンの簡単な例えは、DVI-to-VGAアダプタのようなものです。最近のビデオカードは多くの場合DVIですが、古いVGAモニターがあります。ビデオカードの予想されるDVI入力にプラグインし、独自のVGA入力を備えたアダプタを使用すると、古いモニタを新しいビデオカードで動作させることができます。
アダプター==正方形のペグを丸い穴に合わせます。
Facade ==すべての内部コンポーネントを実行する単一のコントロールパネル。
正直なところ、多くのパターンはプログラムで同じ方法で実装できます。違いは意図的なものです。
アダプター設計パターンは、1つ以上のクラスのインターフェースを、クライアントが使用する予定のインターフェースに「変換」することを目的としています。アダプターは、期待されるインターフェースへの呼び出しを、ラップされたクラスが使用する実際のインターフェースに変換します。
Facadeパターンは、よりシンプルなインターフェイスが必要な場合に使用されます(また、問題のあるクラスをラップすることで同じ方法で実装できます)。既存のインターフェイスに互換性がない場合、必要な場合にのみファサードを使用するとは言いません。読みやすくしたり、デザインの質を落とすなど。
ファサードは、単一のサービスゲートウェイの背後で複数のサービスを編成するように設計されています。アダプタは、既知のインターフェイスを使用して不明なインターフェイスにアクセスする方法を提供するように設計されています。
ファサード:
重要なポイント:(from journaldev Pankaj Kumarによる記事)
ファサードクラス図:
アダプター:
アダプターのクラス図:
このSEの投稿でアダプタの詳細を確認できます。
重要な違い:
よりよく理解するために sourcemaking の記事もご覧ください。
ファサードは通常、アダプターとは対照的です。
+--------------------------------------------------------------+-----------------------------------------------+
| Facade | Adapter |
+--------------------------------------------------------------+-----------------------------------------------+
| Simplifies multiple complex components with single interface | Provides differnet interface for an interface |
| Works with multiple components | Works with single component |
| Control panel is an example | A power adapter is an example |
| High-level interface | Low-level interface |
+--------------------------------------------------------------+-----------------------------------------------+
これについては、あまり形式的ではなく、わかりやすい言葉で説明しようとします。
いくつかのドメインクラスがあり、UIからそれらとやり取りしたいとします。ファサードを使用して、UIレイヤーから呼び出すことができる関数を提供し、UIレイヤーがファサード以外のドメインクラスを認識しないようにすることができます。つまり、ドメインクラスの関数を呼び出す代わりに、ファサードから単一の関数を呼び出し、他のクラスから必要な関数を呼び出します。
一方、アダプターを使用して、必要な機能と同じ機能を持つ可能性のある他の外部コンポーネントを統合できますが、それらの機能はまったく同じ方法で呼び出されません。ドメインにCar
クラスがあり、Carクラスも定義されている外部の自動車プロバイダーと連携しているとします。このクラスでは、関数car.getDoors()
がありますが、外部プロバイダーには同等のcar.getNumDoors()
があります。この関数を呼び出す方法を変更したくないので、アダプタークラスを使用して外部Carクラスをラップし、アダプターのgetDoors()
への呼び出しがgetNumDoors()
に委任されるようにすることができます。外部クラスの。
いつものように、いくつかのパターンには類似点があります。しかし、私はこのように見えるでしょう:
の目的
facadeはsimplicity
adapterは相互運用性です。
アダプタパターンを使用すると、以前は互換性のなかった2つのインターフェイスを相互に連携させることができます。 2つの独立したインターフェースが動作します。
Facadeパターンは、低レベル/きめの細かい既知のインターフェイスを取り、より高いレベル/コースのグレーンインターフェイスでラップします。単一のインターフェースを持ち、別のインターフェースでラップすることにより簡素化されています。
アダプターは、2つのインターフェースを連携させます。
Facadeは、単一のクラスをより高く、より限定されたレベルに公開します。たとえば、ビューモデルファサードは、下位クラスの特定の読み取り専用プロパティのみを公開する場合があります。
私は両方の定義を読んでいますが、まったく同じように見えます。
本当に ?
Adapterという用語は、実際にはStategyであるものを表すために使用されることがあることに気付きました。
たとえば、Zend Frameworkでは、すべてのAdapterクラスは実際にはStrategyパターンの実装です。これは、ネイティブコードをクラスの背後にラップするだけであるため、いくつかの振る舞いをする。
アダプターは、レガシーコードまたは「古いスタイル」のコードをラップするためによく使用されます。
アダプタパターンは、新しいインターフェイスを提供することにより、2つの互換性のないインターフェイスをリンクします。
ファサードパターンは、単一のインターフェイスで複雑なサブシステム(複数のコンポーネントを持つ)を簡素化します。
ファサード
複雑さを抽象化して、よりシンプルなインターフェースを提供します。たとえば、コンピューターOSが基盤となるハードウェアの複雑さを抽象化するとします。または、高レベルのプログラミング言語(Python/JavaScript)は、低レベルの言語(C)と比較して複雑さを抽象化します。
アダプター
これは、ハードウェアアダプターに類似しています。 USB device
をserial port
に接続する場合、USB-serial port adapter
が必要になります。