web-dev-qa-db-ja.com

ファサードとアダプターパターンの違いは何ですか?

私は両方の定義を読んでいますが、まったく同じように見えます。誰が彼らの違いは何かを指摘できますか?

ありがとう

82

Facade Pattern wikiページには、これに関する簡単なメモがあります。

「アダプタは、ラッパーが特定のインターフェイスを尊重し、多態的な動作をサポートする必要がある場合に使用されます。一方、ファサードは、より簡単またはシンプルなインターフェイスを使用したい場合に使用されます。」

さまざまなステレオシステムで動作するように設定したユニバーサルリモートコントロールについて考える必要があるというアナロジーを聞きました。「オン」を押すと、ケーブルボックス、レシーバー、テレビがオンになります。たぶんそれは本当に派手なホームシアターで、明かりを暗くして日陰も描きます。それはファサードです-より複雑な一連のステップを処理する1つのボタン/機能。

アダプタパターンは、2つの互換性のないインターフェイスをリンクするだけです。

EDIT:(コメントに基づく)アダプタパターンの簡単な例えは、DVI-to-VGAアダプタのようなものです。最近のビデオカードは多くの場合DVIですが、古いVGAモニターがあります。ビデオカードの予想されるDVI入力にプラグインし、独自のVGA入力を備えたアダプタを使用すると、古いモニタを新しいビデオカードで動作させることができます。

113
awshepard

アダプター==正方形のペグを丸い穴に合わせます。

Facade ==すべての内部コンポーネントを実行する単一のコントロールパネル。

99
Edwin Buck

正直なところ、多くのパターンはプログラムで同じ方法で実装できます。違いは意図的なものです。

アダプター設計パターンは、1つ以上のクラスのインターフェースを、クライアントが使用する予定のインターフェースに「変換」することを目的としています。アダプターは、期待されるインターフェースへの呼び出しを、ラップされたクラスが使用する実際のインターフェースに変換します。

Facadeパターンは、よりシンプルなインターフェイスが必要な場合に使用されます(また、問題のあるクラスをラップすることで同じ方法で実装できます)。既存のインターフェイスに互換性がない場合、必要な場合にのみファサードを使用するとは言いません。読みやすくしたり、デザインの質を落とすなど。

18
J. Burch

ファサードは、単一のサービスゲートウェイの背後で複数のサービスを編成するように設計されています。アダプタは、既知のインターフェイスを使用して不明なインターフェイスにアクセスする方法を提供するように設計されています。

10
Mike Burton

ファサード:

重要なポイント:(from journaldev Pankaj Kumarによる記事)

  1. ファサードパターンは、クライアントアプリケーションではhelperに似ています
  2. ファサードパターンは、開発のどの時点でも適用できます。通常は、インターフェイスの数が増えてシステムが複雑になる場合です。
  3. サブシステムインターフェイスはFacadeを認識せず、Facadeインターフェイスの参照がありません
  4. 同様の種類のインターフェイスにファサードパターンを適用する、その目的は、同様の種類のジョブを実行する複数のインターフェイスではなく、単一のインターフェイスを提供することです

ファサードクラス図:

enter image description here

アダプター:

  1. 構造パターン
  2. 2つの互換性のないインターフェイスを使用すると便利です。
  3. それ物事を機能させる設計後

アダプターのクラス図:

enter image description here

このSEの投稿でアダプタの詳細を確認できます。

ブリッジパターンとアダプタパターンの違い

重要な違い:

  1. Facadeは新しいインターフェイスを定義しますが、Adapterは古いインターフェイスを使用します。アダプターは、まったく新しいインターフェースを定義するのではなく、2つの既存のインターフェースを連携させます
  2. アダプタとファサードは両方ともラッパーです。しかし、それらは異なる種類のラッパーです。 Facadeの目的はよりシンプルなインターフェイスを作成することであり、Adapterの目的は既存のインターフェイスに合わせて設計することです

よりよく理解するために sourcemaking の記事もご覧ください。

9
Ravindra babu

ファサードは通常、アダプターとは対照的です。

+--------------------------------------------------------------+-----------------------------------------------+
|                            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                           |
+--------------------------------------------------------------+-----------------------------------------------+
5
Premraj

これについては、あまり形式的ではなく、わかりやすい言葉で説明しようとします。

いくつかのドメインクラスがあり、UIからそれらとやり取りしたいとします。ファサードを使用して、UIレイヤーから呼び出すことができる関数を提供し、UIレイヤーがファサード以外のドメインクラスを認識しないようにすることができます。つまり、ドメインクラスの関数を呼び出す代わりに、ファサードから単一の関数を呼び出し、他のクラスから必要な関数を呼び出します。

一方、アダプターを使用して、必要な機能と同じ機能を持つ可能性のある他の外部コンポーネントを統合できますが、それらの機能はまったく同じ方法で呼び出されません。ドメインにCarクラスがあり、Carクラスも定義されている外部の自動車プロバイダーと連携しているとします。このクラスでは、関数car.getDoors()がありますが、外部プロバイダーには同等のcar.getNumDoors()があります。この関数を呼び出す方法を変更したくないので、アダプタークラスを使用して外部Carクラスをラップし、アダプターのgetDoors()への呼び出しがgetNumDoors()に委任されるようにすることができます。外部クラスの。

3
Pin

いつものように、いくつかのパターンには類似点があります。しかし、私はこのように見えるでしょう:

  • ファサードはレイヤー全体をカプセル化するために使用され、「便利に」アクセスするためのいくつかの方法を提供します
  • アダプターが使用されます。この場合、2つのコンポーネントが既に連携して動作するはずですが、そうでないのは、インターフェースの「重要でない」違いのためだけです。
3
Chris Lercher

の目的

facadesimplicity

adapter相互運用性です。

2
Vladimir Kornea

アダプタパターンを使用すると、以前は互換性のなかった2つのインターフェイスを相互に連携させることができます。 2つの独立したインターフェースが動作します。

Facadeパターンは、低レベル/きめの細かい既知のインターフェイスを取り、より高いレベル/コースのグレーンインターフェイスでラップします。単一のインターフェースを持ち、別のインターフェースでラップすることにより簡素化されています。

2
wyldebill

アダプターは、2つのインターフェースを連携させます。

Facadeは、単一のクラスをより高く、より限定されたレベルに公開します。たとえば、ビューモデルファサードは、下位クラスの特定の読み取り専用プロパティのみを公開する場合があります。

2
Michael Finger

私は両方の定義を読んでいますが、まったく同じように見えます。

本当に ?

Adapterという用語は、実際にはStategyであるものを表すために使用されることがあることに気付きました。

たとえば、Zend Frameworkでは、すべてのAdapterクラスは実際にはStrategyパターンの実装です。これは、ネイティブコードをクラスの背後にラップするだけであるため、いくつかの振る舞いをする。

アダプターは、レガシーコードまたは「古いスタイル」のコードをラップするためによく使用されます。

0
mexique1

アダプタパターンは、新しいインターフェイスを提供することにより、2つの互換性のないインターフェイスをリンクします。

ファサードパターンは、単一のインターフェイスで複雑なサブシステム(複数のコンポーネントを持つ)を簡素化します。

0
Avik Chowdhury

ファサード

複雑さを抽象化して、よりシンプルなインターフェースを提供します。たとえば、コンピューターOSが基盤となるハードウェアの複雑さを抽象化するとします。または、高レベルのプログラミング言語(Python/JavaScript)は、低レベルの言語(C)と比較して複雑さを抽象化します。

アダプター

これは、ハードウェアアダプターに類似しています。 USB deviceserial portに接続する場合、USB-serial port adapterが必要になります。

0
Arun Ghosh