门面模式,也叫外观模式,定义:
要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。
这个设计模式最核心的作用就是屏蔽内部系统或模块之间的差异,对外提供统一的接口和使用方法。
在微服务或者多系统架构中,门面模式应用的比较多,在单服务或者单系统中,门面模式应用的比较少。
简单来说,门面模式就是一个有资质且规范性较强的中介,它掌握着各种各样的资源,客户需要某个资源就直接和中介联系,中介将资源处理好以后提供给客户,客户无需关心中介和资源之间的交互。
门面模式没有固定的编程模式,符合设计思路,能封装内部资源差异,能对外提供统一的使用规范,即可。
举个例子,注册公司通常有三个核心步骤:
- 前往工商局,申请公司营业执照
- 前往银行,开设公司账户
- 前往税务局,开设纳税号
工商局、银行、税务局,都有自己的系统:
// 工商注册
public class AdminOfIndustry {
public Company register(String name) {
// 业务逻辑
}
}
// 银行开户
public class Bank {
public String openAccount(String companyId) {
// 业务逻辑
}
}
// 纳税登记
public class Taxation {
public String applyTaxCode(String companyId) {
// 业务逻辑
}
}
使用门面模式,就需要有一个代理中介,负责完成这三个步骤:
public class Facade {
public Company openCompany(String name) {
Company c = this.admin.register(name);
String bankAccount = this.bank.openAccount(c.getId());
c.setBankAccount(bankAccount);
String taxCode = this.taxation.applyTaxCode(c.getId());
c.setTaxCode(taxCode);
return c;
}
}
以后再注册公司就很方便了:
Company c = facade.openCompany("公司名称");
门面模式的其它应用场景,举例:
- 前后端分离开发模式中,后端服务提供接口,这也算是门面模式,通过接口封装了后端的复杂性
- 微服务网关系统,客户端只和网关打交道,对网关背后的微服务一无所知,典型的门面模式
- 炒股票使用证券公司客户端,也是门面模式,股民通过证券公司买卖股票,证券公司完成背后的真实交易