134

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

ありがとう

4

16 に答える 16

169

ファサードパターンのwikiページには、これに関する簡単なメモがあります。

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

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

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

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

于 2010-06-02T20:31:11.120 に答える
155

アダプター == 丸い穴に四角いペグをはめ込みます。

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

于 2010-06-02T20:36:22.260 に答える
23

ファサード:

重要なポイント: ( pankaj Kumar によるジャーナル開発の記事から)

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

ファサード クラス図:

ここに画像の説明を入力

アダプタ:

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

アダプターのクラス図:

ここに画像の説明を入力

Adapter の詳細については、次の SE の投稿を参照してください。

Bridge パターンと Adapter パターンの違い

主な違い:

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

理解を深めるために、ソース作成の記事もご覧ください。

于 2016-06-05T17:48:29.320 に答える
21

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

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

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

于 2010-06-02T20:39:45.603 に答える
17

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

于 2010-06-02T20:30:51.987 に答える
6

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

  • ファサードは、レイヤー全体をカプセル化するために使用され、「便利に」アクセスするためのいくつかの方法を提供します
  • アダプターが使用されます。この場合、2つのコンポーネントが既に連携しているはずですが、連携していないのは、インターフェースの「重要でない」違いのためだけです。
于 2010-06-02T20:34:25.820 に答える
4

あまり形式張らずに平易な言葉で説明しようと思います。

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

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

于 2010-06-03T07:38:59.430 に答える
3

アダプタパターンにより、以前は互換性がなかった2つのインターフェイスを相互に機能させることができます。2つの別々のインターフェースが機能しています。

ファサードパターンは、低レベル/細粒度の既知のインターフェイスを使用し、高レベル/コースグレインのインターフェイスでラップします。別のインターフェイスでラップすることで簡素化された単一のインターフェイスを備えています。

于 2010-06-02T20:33:56.023 に答える
3

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

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

于 2010-06-02T20:34:07.630 に答える
2

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

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

于 2019-08-12T21:43:51.490 に答える
0

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

本当に ?

Adapterという用語が、実際にはStategyとは何かを説明するために使用されることがあることに気付きました。

たとえば、Zend Frameworkでは、すべてのAdapterクラスは実際にはStrategyパターンの実装です。これらのクラスはネイティブ コードをクラスの後ろにラップするだけで、複数の動作を行うことができるからです。

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

于 2010-06-04T18:08:44.560 に答える