做过电商系统的小伙伴应该知道,用户购买一个东西之后,系统需要做的操作包括支付收费 、生成订单,扣除库存等几个操作。如果不使用门面模式那是怎样的呢?那我们得分别为支付收费、生成订单,扣除库存这几个动作提供接口,让用户一个一个去调。使用门面模式就是我们提供一个统一的接口,我们来处理这几个动作,用户只要知道调了这个接口就能下单,购买到东西,并不需要去了解其中完成多少个步骤,有多少个子系统参与。
这么一说,你是不是已经一直在使用门面模式,只是你自己并没有意识到你在使用它?虽然简单,也一直已经在使用,还是有必要探究一下它的细节以及注意点。
一、定义
定义(百度百科):门面模式,是指提供一个统一的接口去访问多个子系统的多个不同的接口,它为子系统中的一组接口提供一个统一的高层接口。使得子系统更容易使用。
这个定义可以说是非常清晰了,基本上每个字都认识,放在一起应该也能理解它的意思吧?【呵呵】
要点:
1、提供统一的接口,用于访问多个子系统。
二、UML
涉及到的角色
(1)、门面类(Facade),提供一个统一的接口给客户端调用
(2)、各种子系统:OrderSystem、ProductSystem、PaySystem。

三、实例
代码实现如下,基本没什么可说的,直接按照UML图,编写代码即可。
(一)、各种系统服务:订单系统、支付系统、库存系统。
package com.facade;
public class OrderSystem {
public void createOrder(){
System.out.println("创建一个新的订单!!!");
}
}package com.facade;
public class PaySystem {
public void pay(){
System.out.println("支付:支付完成!!!");
}
}package com.facade;
public class ProductSystem {
public void deProductCount(){
System.out.println("扣减库存!!!");
}
}
(二)、门面类,提供一个统一的入口,让客户端调用
package com.facade;
public class Facade {
private PaySystem paySystem;
private OrderSystem orderSystem;
private ProductSystem productSystem;
public Facade(){
paySystem = new PaySystem();
orderSystem = new OrderSystem();
productSystem = new ProductSystem();
}
public void buyABook(){
paySystem.pay();
orderSystem.createOrder();
productSystem.deProductCount();
}
}
(三)、调用
package com.facade;
public class TestMain {
public static void main(String[] args) {
Facade facade = new Facade();
facade.buyABook();
}
}
(四)、执行结果

四、结论
门面模式(外观模式):提供一个统一接口,集中多个子系统,多个接口方法,提供服务。如编程中MVC模式,C(Controller)即为门面,提供统一入口、M(Model)即提供各种系统服务。
优势:
1、对客户端友好,有统一的入口提供给客户端。
2、对服务调用跟容易管理记录,也更安全。可以想象我们提供一个购物接口肯定比让客户端自己去调创建订单、减少库存、支付更安全,如果客户端忘了调某个服务,就会出现问题。
缺点:
1、门面类耦合了各种服务,较为复杂,容易出错。