java 中的 Facade 示例
立面是結構設計模式。它隱藏了大型系統的複雜性,併為客戶端提供了簡單的介面。
客戶端僅使用 Facade ,並不擔心子系統的相互依賴性。
四人幫的定義:
為子系統中的一組介面提供統一介面。Façade 定義了一個更高階別的介面,使子系統更易於使用
結構體:
現實世界的例子:
想想一些旅行預訂網站,如 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){
}
}
說明:
-
FlightBooking, TrainBooking and HotelBooking
是大系統的不同子系統:TravelFacade
-
TravelFacade
提供了一個簡單的介面來預訂以下選項之一Flight Booking Train Booking Hotel Booking Flight + Hotel booking Train + Hotel booking
-
來自 TravelFacade 的 book API 在內部呼叫子系統的 API
flightBooking.bookFlight trainBooking.bookTrain(info); hotelBooking.bookHotel(info);
-
通過這種方式,
TravelFacade
提供了更簡單,更簡單的 API,無需暴露子系統 API。
適用性和使用案例(來自維基百科):
- 訪問複雜系統需要一個簡單的介面。
- 子系統的抽象和實現是緊密耦合的。
- 需要一個分層軟體的每個級別的入口點。
- 系統非常複雜或難以理解。