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。
适用性和使用案例(来自维基百科):
- 访问复杂系统需要一个简单的界面。
- 子系统的抽象和实现是紧密耦合的。
- 需要一个分层软件的每个级别的入口点。
- 系统非常复杂或难以理解。