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. 系统非常复杂或难以理解。