为子系统中的一组接口提供一个一致的界面,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();
- }
- }