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


回答:


142

ファサードパターンのwikiページには、この程度の簡単なノートを持っています。

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

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

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

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


4
リモコンを使った素晴らしいアナロジー。アダプターのパターンの説明は問題ありませんが、同じような類推を思い付くのは素晴らしいことです。
Kevin Le-Khnle

2
確かに優れた類推!Adapterパターンの現実の世界でのJavaの例では、それをよりよく理解することに役立つことがあります。InputStreamReader適合させるInputStreamReaderしてOutputStreamWriterいる適合させOutputStreamWriter異なる抽象型である両方。
BalusC 2010年

1
@Khnle -アクションでアダプタパターン:upload.wikimedia.org/wikipedia/commons/8/80/...
エリックPetroelje

@Khnle-(個人的な経験に基づいて)アダプターの類推で追加されました。@Eric-インスピレーションと素晴らしい写真をありがとう!@BalusC-現実世界の例に対する良い呼びかけ。
awshepard

@BalusC-私もあなたの例が好きです。幸い私はJavaを知っています。@Eric Petroelje-写真は千の言葉に値します:-) @awshepard-私がプログラミングしなかった場合、私もあなたに説明を追うことができます:-)
Kevin Le-Khnle

125

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

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


8
その答えは完全に馬鹿げています!私はそれをパターンノートに含めています。:)
ジョシュアデール

1
シンプルさの素晴らしさ
a-man

20

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

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

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


18

ファサード:

要点:(Pankaj Kumarによるjournaldev記事より)

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

ファサードクラス図:

ここに画像の説明を入力してください

アダプタ:

  1. それは構造的なパターン
  2. 2つの互換性のないインターフェースを操作すると便利です
  3. 設計後に機能する

アダプターのクラス図:

ここに画像の説明を入力してください

アダプターの詳細については、このSEの投稿をご覧ください。

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

主な違い:

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

理解を深めるには、ソースメイキングの記事もご覧ください。


図を見るのが大好き!しかし、いくつかの明確化は、パラメータの数/タイプを変更するとき、それはもはやアダプタではないことを意味しますか?のようsomeMethod(int year, int month) に委任された、someMethod(DateTime start, DateTime end)または委任されたと言いましょsomeMethod()someMethod(T param)
Jaime Sangcap

両方のメソッドが同じクラスにある場合、それはオーバーロードと呼ばれます。彼らが異なるクラスに属している場合、アダプターとアダプティの関係が実装されていれば、それは支持者になることができます
Ravindra

本当にいい説明。
ドゥクフィラン2017

14

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



8

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

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

4

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

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

1
良い説明。これは私が言葉Infactは真であるアダプタを、記述した「重要でない違い」に出くわした最初の時間です
Sudara

4

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

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

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


3

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

ファサードパターンは、低レベル/細粒度の既知のインターフェースを取り、高レベル/粗粒度のインターフェースでラップします。単一のインターフェースがあり、別のインターフェースでラップすることにより簡略化されています。


3

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

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


1

ファサード

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

アダプタ

ハードウェアアダプターに類似しています。接続したいと言うUSB deviceにはserial port、あなたが必要となりますUSB-serial port adapter


1

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

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


1

これら2つのパターンの違いは明らかですが、デザインパターンの領域ではなく、ドメインモデリングです。以下にその理由を説明します。

最初に、他の人がここで言ったことを繰り返し説明し、次にメモを追加します。

Facadeは、サブシステム(外部システムまたはレガシーシステム)へのインターフェースであり、クライアント(米国)のアクセスを簡素化します。Facadeは他のサブシステムのインターフェースを非表示にする(一部の呼び出しを集約するか、必要のない一部のAPIを非表示にする)ため、クライアントはこのFacadeを通じてのみそのサブシステムにアクセスします。

一方、アダプタは別のサービスまたはオブジェクトのラッパーです。ラップされたオブジェクトを、クライアントが期待する標準インターフェースに準拠させます。「元帳」オブジェクトに、微調整(パラメーターの変更、名前の変更など)が必要なメソッドがあるとします。アダプターで包むことができます。

しかし、それでも違いは明らかではないかもしれません。ここで、これらの2つのパターンの主な違いを取り上げ、さらに混乱する余地を残します。

Facadeは他のサブシステムのドメインモデルを変更しませんが、Adapterは変更します。 これが大きな違いです。限目。

腐敗防止レイヤーを作成するときにこれらの2つを組み合わせるのはそのためです。使用したいサブシステムがあるが、そのドメインモデルがドメインモデルを混乱させたくないとします。あなたならどうしますか?腐敗防止レイヤーを作成します。どうやって?最初に、サブシステムのインターフェースへのアクセスを簡略化するFacadeを作成し、次にそのインターフェースで使用されるドメインオブジェクトのアダプターを作成します(ファサードは他のサブシステムのドメインモデルを保持していることに注意してください)。

ドメインモデリングでは、多くのデザインパターンを使用できます。これは、ファサードとアダプタのデザインパターンにも当てはまります。これら2つのパターンの違いは「設計パターン」レルムでは明確ではないかもしれませんが、「ドメインモデリング」レルムではより明確です。


0

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

本当に ?

アダプタという用語が、実際にはStategyを表すのに使用されていることに気づきました。おそらく、この単語の方が表現力があるからです。

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

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


0

Facadeパターンの主な目的は、クラスまたはサブシステムを使いやすくすることですが、Adapterパターンの主な目的は、クライアントが期待するものにインターフェースを調整することです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.