198

ファサードは他の多くのクラスを含むクラスですか?

それをデザインパターンにするものは何ですか?私にとって、それは普通のクラスのようなものです。

このFacadeパターンについて説明してもらえますか?

4

21 に答える 21

197

デザイン パターンは、繰り返し発生する問題を解決するための一般的な方法です。すべての設計パターンのクラスは、通常のクラスです。重要なのは、それらがどのように構成され、特定の問題を可能な限り最善の方法で解決するためにどのように連携するかです。

Facadeデザイン パターンは、複雑なシステムへのインターフェイスを簡素化します。通常、複雑なシステムのサブシステムを構成するすべてのクラスで構成されているためです。

Facade は、システムの複雑な詳細からユーザーを保護しsimplified vieweasy to use. またdecouples、サブシステムの詳細からシステムを使用するコードも示し、後でシステムを変更しやすくします。

http://www.dofactory.com/Patterns/PatternFacade.aspx

http://www.blackwasp.co.uk/Facade.aspx

また、デザインパターンを学ぶ上で重要なのは、与えられた問題にどのパターンが当てはまるかを認識し、それを適切に使用できるようにすることです。パターンを誤用したり、パターンを知っているという理由だけで問題に当てはめようとしたりすることは非常によくあることです。設計パターンを学習\使用する際には、これらの落とし穴に注意してください。

于 2011-03-09T07:09:43.510 に答える
44

前の回答で説明したように、消費するクライアントに単純なインターフェイスを提供します。例: 「ESPN を見る」は意図した機能です。ただし、次のようないくつかの手順が必要です。

  1. 必要に応じてテレビのスイッチを入れます。
  2. 衛星/ケーブルの機能を確認してください。
  3. 必要に応じて ESPN に切り替えます。

しかし、ファサードはこれを単純化し、「ESPN の監視」機能をクライアントに提供するだけです。

于 2011-03-09T07:14:10.863 に答える
30

Facade はシステムの複雑さを隠し、クライアントがシステムにアクセスできるインターフェイスをクライアントに提供します。

public class Inventory {
public String checkInventory(String OrderId) {
    return "Inventory checked";
}
}

public class Payment {
public String deductPayment(String orderID) {
    return "Payment deducted successfully";
}
}


public class OrderFacade {
private Payment pymt = new Payment();
private Inventory inventry = new Inventory();

public void placeOrder(String orderId) {
    String step1 = inventry.checkInventory(orderId);
    String step2 = pymt.deductPayment(orderId);
    System.out
            .println("Following steps completed:" + step1
                    + " & " + step2);
   }
}

public class Client {
       public static void main(String args[]){
         OrderFacade orderFacade = new OrderFacade();
         orderFacade.placeOrder("OR123456");
         System.out.println("Order processing completed");
       }
  }
于 2013-12-14T09:52:03.997 に答える
11

ファサードは、他の多くのクラスを含むクラスとして記述されるべきではありません。実際、これはこのクラスへのインターフェースであり、クラスの使用を容易にする必要があります。それ以外の場合、ファサード クラスは役に立ちません。

于 2011-03-09T07:12:41.987 に答える
9

お問い合わせについて:

Facade は他の多くのクラスを含むクラスですか?

はい。アプリケーション内の多くのサブシステムのラッパーです。

それをデザインパターンにするものは何ですか?私にとっては、普通のクラスのようなものです

すべてのデザイン パターンも通常のクラスです。@ Unmesh Kondolikarはこの質問に正しく答えました。

この Facade について説明してもらえますか。私はパターンを設計するのが初めてです。

GoF によると、 Facadeのデザイン パターンは次のように定義されています。

サブシステム内の一連のインターフェイスに統一されたインターフェイスを提供します。ファサード パターンは、サブシステムを使いやすくする上位レベルのインターフェイスを定義します

Facadeパターンは通常、次の場合に使用されます。

  1. 複雑なシステムにアクセスするには、単純なインターフェースが必要です。
  2. サブシステムの抽象化と実装は緊密に結合されています。
  3. 階層化されたソフトウェアの各レベルへのエントリ ポイントが必要です。
  4. システムが非常に複雑であるか、理解するのが難しい。

cleartrip Web サイトの実際の例を見てみましょう。

このウェブサイトは予約するためのオプションを提供します

  1. フライト
  2. ホテル
  3. フライト + ホテル

コードスニペット:

import java.util.*;

public class TravelFacade{
    FlightBooking flightBooking;
    TrainBooking trainBooking;
    HotelBooking hotelBooking;

    enum BookingType {
        Flight,Train,Hotel,Flight_And_Hotel,Train_And_Hotel;
    }; 

    public TravelFacade(){
        flightBooking = new FlightBooking();
        trainBooking = new TrainBooking();
        hotelBooking = new HotelBooking();        
    }
    public void book(BookingType type, BookingInfo info){
        switch(type){
            case Flight:
                // book flight;
                flightBooking.bookFlight(info);
                return;
            case Hotel:
                // book hotel;
                hotelBooking.bookHotel(info);
                return;
            case Train:
                // book Train;
                trainBooking.bookTrain(info);
                return;
            case Flight_And_Hotel:
                // book Flight and Hotel
                flightBooking.bookFlight(info);
                hotelBooking.bookHotel(info);
                return;
             case Train_And_Hotel:
                // book Train and Hotel
                trainBooking.bookTrain(info);
                hotelBooking.bookHotel(info);
                return;                
        }
    }
}
class BookingInfo{
    String source;
    String destination;
    Date    fromDate;
    Date     toDate;
    List<PersonInfo> list;
}
class PersonInfo{
    String name;
    int       age;
    Address address;
}
class Address{

}
class FlightBooking{
    public FlightBooking(){

    }
    public void bookFlight(BookingInfo info){

    }
}
class HotelBooking{
    public HotelBooking(){

    }
    public void bookHotel(BookingInfo info){

    }
}
class TrainBooking{
    public TrainBooking(){

    }
    public void bookTrain(BookingInfo info){

    }
}

説明:

  1. FlightBooking, TrainBooking and HotelBookingは大規模システムの異なるサブシステムです:TravelFacade

  2. TravelFacade以下のオプションのいずれかを予約するためのシンプルなインターフェースを提供します

    Flight Booking
    Train Booking 
    Hotel Booking
    Flight + Hotel booking 
    Train + Hotel booking
    
  3. TravelFacade の book API は、サブシステムの以下の API を内部的に呼び出します

    flightBooking.bookFlight
    trainBooking.bookTrain(info);
    hotelBooking.bookHotel(info);
    
  4. このように、TravelFacadeサブシステム API を公開することなく、よりシンプルで簡単な API を提供します。

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

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

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

于 2016-03-08T03:37:59.060 に答える
6

ファサード パターンは、他の多くのインターフェイスのラッパーであり、よりシンプルなインターフェイスを生成します。

デザイン パターンは、繰り返し発生する問題を解決し、一般的にコードを簡素化するので便利です。同じパターンを使用することに同意する開発者のチームでは、お互いのコードを維持する際の効率と理解が向上します。

より多くのパターンについて読んでみてください:

ファサード パターン: http://www.dofactory.com/Patterns/PatternFacade.aspx#_self1

またはより一般的に: http://www.dofactory.com/Patterns/Patterns.aspx

于 2011-03-09T07:11:47.377 に答える
6

Façade パターンのもう 1 つの用途は、チームの学習曲線を短縮することです。例を挙げましょう:

Excel が提供する COM オブジェクト モデルを使用して、アプリケーションが MS Excel と対話する必要があるとします。あなたのチーム メンバーの 1 人は、すべての Excel API を知っており、その上に Facade を作成し、アプリケーションのすべての基本的なシナリオを満たします。チームの他のメンバーは、Excel API の学習に時間を費やす必要はありません。チームは、シナリオの実行に関連する内部構造やすべての MS Excel オブジェクトを知らなくても、ファサードを使用できます。それは素晴らしいことではありませんか?

したがって、複雑なサブシステムの上に簡素化された統一されたインターフェイスを提供します。

于 2011-03-16T10:19:12.357 に答える
5

ファサードの別の例:アプリケーションがデータベースに接続し、UIに結果を表示するとします。データベースまたはモックオブジェクトを使用して実行する場合のように、ファサードを使用してアプリケーションを構成可能にすることができます。したがって、facadeクラスに対してすべてのデータベース呼び出しを行い、そこでapp configを読み取り、dbクエリを実行するか、モックオブジェクトを返すかを決定します。このようにして、dbが使用できない場合にアプリケーションはdbに依存しなくなります。

于 2013-02-04T07:02:52.660 に答える
5

ファサードは、ほとんどが呼び出される単純化された関数を公開し、実装は、クライアントが対処しなければならない複雑さを隠します。一般に、実装では複数のパッケージ、クラス、関数が使用されます。適切に作成されたファサードにより、他のクラスに直接アクセスすることはほとんどありません。たとえば、ATM に行って、いくらかの金額を引き出したとき。ATM は、所有する銀行に直接送られているのか、それとも外部銀行のネゴシエートされたネットワークを経由して送られているのかを隠します。ATM は、クライアントとして直接扱う必要のない複数のデバイスとサブシステムを消費するファサードのように機能します。

于 2013-03-26T18:29:58.650 に答える
4

ファサードは、ツールキットと完全なアプリケーションの間にあるレベルの機能を備えたクラスであり、パッケージまたはサブシステム内のクラスを簡単に使用できるようにします。Facade パターンの目的は、サブシステムを使いやすくするインターフェイスを提供することです。--本のDesign Patterns in C#からの抜粋 。

于 2011-03-09T07:19:32.313 に答える
3

設計パターンは、ソフトウェア設計の特定のコンテキスト内で一般的に発生する問題に対する一般的な再利用可能なソリューションです。

Facade デザイン パターンは、クラスまたはエンティティ間の関係を作成する方法を定義する構造パターンです。ファサード デザイン パターンは、より複雑なサブシステムへの単純化されたインターフェイスを定義するために使用されます。

ファサード パターンは、相互に依存する多数のクラスを操作する場合、または複数のメソッドを使用する必要があるクラスを操作する場合、特に使用が複雑であったり理解しにくい場合に理想的です。ファサード クラスは、理解しやすく使いやすいメンバーのセットを含む「ラッパー」です。これらのメンバーは、ファサード ユーザーに代わってサブシステムにアクセスし、実装の詳細を隠します。

ファサード デザイン パターンは、ソース コードが利用できないか、既存のインターフェイスが広く使用されているためにリファクタリングできない、設計が不十分なサブシステムをラップする場合に特に役立ちます。さまざまな目的のために機能のサブセットを提供するために、複数のファサードを実装することを決定する場合があります。

ファサード パターンの使用例の 1 つは、Web サイトをビジネス アプリケーションと統合する場合です。既存のソフトウェアには、特定の方法でアクセスする必要がある大量のビジネス ロジックが含まれている場合があります。Web サイトでは、このビジネス ロジックへの限定的なアクセスしか必要としない場合があります。たとえば、Web サイトでは、販売商品の在庫が限定レベルに達したかどうかを表示する必要がある場合があります。ファサード クラスの IsLowStock メソッドは、これを示すブール値を返すことができます。舞台裏では、この方法は、現在の物理的な在庫、入庫、割り当てられたアイテム、および各アイテムの低い在庫レベルを処理する複雑さを隠している可能性があります。

于 2015-01-28T08:16:04.540 に答える
2

すべての設計パターンは、特定のアプリケーションに適した方法で配置されたいくつかのクラスです。ファサード パターンの目的は、1 つまたは複数の操作の複雑さを隠すことです。http://preciselyconcise.com/design_patterns/facade.phpから例を見て、ファサード パターンを学ぶことができます。

于 2014-05-09T17:06:29.833 に答える
1

これは基本的に単一のウィンドウ クリアランス システムです。別のクラスの特定のメソッドに委譲する作業を割り当てます。

于 2014-07-10T06:47:53.570 に答える