java 中的 Facade 示例

立面是結構設計模式。它隱藏了大型系統的複雜性,併為客戶端提供了簡單的介面。

客戶端僅使用 Facade ,並不擔心子系統的相互依賴性。

四人幫的定義:

為子系統中的一組介面提供統一介面。Façade 定義了一個更高階別的介面,使子系統更易於使用

結構體:

StackOverflow 文件

現實世界的例子:

想想一些旅行預訂網站,如 makemytrip,cleartrip,它提供預訂火車,航班和酒店的服務。

程式碼段:

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。

適用性和使用案例(來自維基百科):

  1. 訪問複雜系統需要一個簡單的介面。
  2. 子系統的抽象和實現是緊密耦合的。
  3. 需要一個分層軟體的每個級別的入口點。
  4. 系統非常複雜或難以理解。