一、概念
为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这个子系统更加容易使用。
适用性
1、当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给这些不需要定制子系统的用户带来一些使用上的困难。Facade可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过facade层。
2、客户程序与抽象类的实现部分之间存在着很大的依赖性。引入facade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。
3、当你需要构建一个层次结构的子系统时,使用facade模式定义子系统中每层的入口点。
如果子系统之间是相互依赖的,你可以让它们仅通过facade进行通讯,从而简化了它们之间的依赖关系。
二、举例子
客户下单付款后,有一系列的动作:采摘/商品包装/物流送货
PS:订单流程,需要关注三个组件服务的使用细节。有使用风险
- 使用外观模式
---------糅合功能,对外只提供一个入口。
PS:
1、调用方只关注facade组件,不需要知道底层服务。
2、隐藏掉底层服务中,不相干的功能。
场景:当访问流程较复杂时,将流程封闭成一个接口,供外部使用
三、代码示例
采摘服务
/**
* 采摘服务
*/
public class PickService {
/**
* 采摘水果
*/
public void doPick(){
System.out.println("开始采摘");
System.out.println(". . .");
System.out.println("采摘完成");
}
public void doOther(){
System.out.println("其它服务");
}
}
打包服务
/**
* 包装服务
*/
public class PackService {
public void doPack(){
System.out.println("开始打包");
System.out.println(". . .");
System.out.println("打包完成");
}
public void doOther(){
System.out.println("其它服务");
}
}
配送服务
/**
* 快递服务
*/
public class SendService {
/**
* 指定目的地,发送快递
*/
public void doSend(){
System.out.println("开始配送");
//以下物流运输业务。。。。
System.out.println("本次快递目的地:北京-朝阳区-三里屯");
}
public void doOther(){
System.out.println("其它服务");
}
}
门面类
/**
* 订单 Facade
*/
public class OrderFacade {
// 采摘服务
private PickService pickService;
// 包装服务
private PackService packService;
// 配送服务
private SendService sendService;
/**
* 构造方法
* 注入采摘,打包,配送服务
*/
public OrderFacade(){
pickService = new PickService();
packService = new PackService();
sendService = new SendService();
}
/**
* 客户订单一键处理类
*/
public void doOrder(){
//采摘
System.out.println("--------------");
pickService.doPick();
//包装
System.out.println("--------------");
packService.doPack();
//快递
System.out.println("--------------");
sendService.doSend();
}
}
客户端
/**
* 客户服务
*/
public class CustomerClient {
public static void main(String[] args) {
doOrderFacade();
}
/**
* 下订单方式一,三步走
*/
public static void doOrder() {
PickService pickService = new PickService();
PackService packService = new PackService();
SendService sendService = new SendService();
//采摘
System.out.println("--------------");
pickService.doPick();
//包装
System.out.println("--------------");
packService.doPack();
//快递
System.out.println("--------------");
sendService.doSend();
}
/**
* 下订单方式二,一键完成
*/
public static void doOrderFacade() {
OrderFacade orderFacade = new OrderFacade();
orderFacade.doOrder();
}
}