外观模式
要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。外观模式提供了一个高层次的接口,使得子系统更易使用。
外观模式注重“统一的对象”,即提供一个访问子系统的接口,只有通过该接口(Facade)才能允许访问子系统的行为发生。
外观模式角色
- 外观(Facade)角色:客户端可以调用该角色的方法,该角色知晓相关子系统的功能和责任。正常情况下,本角色会将客户端发来的请求委派到相应的子系统,即该角色没有实际的业务逻辑,只是一个委托类;
- 子系统(Subsystem)角色:可以同时有一个或多个子系统,每一个系统都不是一个单独的类,而是一个类的集合。子系统不知道外观角色的存在,对于子系统而言,外观角色仅仅是另一个客户端而已。
外观模式的优点
- 减少系统的相互依赖性,所有的依赖都是对Facade对象的依赖,与子系统无关;
- 提高灵活性,不管子系统如何变化,只要不影响Facade对象,任何活动都是自由的;
- 提高安全性,Facade中未提供的方法,外界就无法访问,提高系统的安全性。
使用场景
- 为一个复杂的系统或子系统提供一个供外界访问的接口;
- 子系统相互独立,外界对子系统的访问只要黑箱操作而已;
- 预防风险扩散,通过Facade进行访问操作控制。
<span style="font-size:18px;">package facademodel;
public class Airport {
public void bookTicket(String from,String to){
System.out.println("订购了从"+from+"到"+to+"的机票");
}
}
</span>
<span style="font-size:18px;">package facademodel;
public class Restaurant {
public void reserve(int num){
System.out.println("订了一桌"+num+"个人的酒席");
}
}
</span>
<span style="font-size:18px;">package facademodel;
public class Hotel {
public void reserve(int days){
System.out.println("订了"+days+"天的酒店");
}
}
</span>
<span style="font-size:18px;">package facademodel;
public class Chauffeur {
public void drive(String to){
System.out.println("司机开车去"+to);
}
}
</span>
<span style="font-size:18px;">package facademodel;
/**
* 秘书类,相当于一个外部接口
*
*/
public class Secretary {
private Chauffeur chauffeur = new Chauffeur();
private Hotel hotel = new Hotel();
private Restaurant restaurant = new Restaurant();
private Airport airport = new Airport();
//安排出差
public void trip(String to, int days){
airport.bookTicket("上海", to);
chauffeur.drive("虹桥机场");
hotel.reserve(days);
}
//安排饭局
public void repast(int num){
restaurant.reserve(num);
chauffeur.drive("酒店");
}
}
</span>
<span style="font-size:18px;">package facademodel;
/**
* 相当于客户端
*
*/
public class Boss {
public static void main(String[] args) {
// TODO Auto-generated method stub
Secretary s = new Secretary();
System.out.println("老板告诉秘书到北京出差10天");
s.trip("北京", 10);
System.out.println("老板告诉秘书到请10个人吃饭");
s.repast(10);
}
}
</span>