一.定义
创建一个接口来调用其他系统的服务,而不是直接使用客户端调用。
属于结构型模式
二.代码
以生活中在网上购买商品为例
新建库存服务类
public class StockService {
public boolean deduct() {
System.out.println("库存扣减成功...");
return true;
}
}
支付服务
public class PaymentService {
public boolean pay() {
System.out.println("支付成功...");
return true;
}
}
物流服务
public class LogisticsService {
public void enter() {
System.out.println("进入物流系统,物流单号123456");
}
}
简单起见我们就写这三个服务
下面我们来写一个门面类
public class FacadeService {
StockService stockService = new StockService();
PaymentService paymentService = new PaymentService();
LogisticsService logisticsService = new LogisticsService();
public void order() {
System.out.println("流程开始...");
paymentService.pay();
stockService.deduct();
logisticsService.enter();
System.out.println("物流运输中...");
}
}
客户端调用,我们的客户端调用的时候只需要调用门面服务类的一个接口
public class Test {
public static void main(String[] args) {
FacadeService facadeService = new FacadeService();
facadeService.order();
}
}
输出结果
看到这里,可能有人会说,你这不是静态代理模式吗?对,门面模式就是一种特殊的静态代理模式。那它和静态代理有什么区别呢?
门面模式强调封装,而静态代理强调增强。
三.门面模式在源码中的应用
JdbcUtils、Configuration
四.门面模式的优缺点
优点:符合迪米特法则,降低了子系统的风险
缺点:不符合开闭原则,当子系统扩展时,可能需要修改门面类