1、什么是外观模式
将一些复杂的流程封装成一个接口对外提供,同时对这个有复杂逻辑的接口进行优化,一般都是按照功能来分割开来,但是这样会使代码更容易浏览,逻辑更为清晰,调试更为简单。
2、外观模式的应用场景

刚刚上边也提到了,外观模式就是将复杂的流程封装为一个接口给用户调用,该模式有三种角色:
子系统角色:将复杂的流程按照功能分割成各个模块,每个模块就称之为子系统角
色。
门面角色:外观模式的核心,调用子系统角色,将各个子系统角色组合起来。
客户角色:通过调用Facade来完成要实现的功能。
3、具体代码实现
需要重构的代码
@Slf4jpublic class PayCallbackService {// 用户下单成功后,有那些操作?// 1.增加支付回调接口日志// 2.修改订单数据库状态为已经成功// 3.调用积分服务接口// 4.调用消息服务平台服务接口public boolean callback(Map<String, String> verifySignature) {// 1.第一步打印日志信息String orderId = verifySignature.get("orderId"); // 获取后台通知的数据,其他字段也可用类似方式获取String respCode = verifySignature.get("respCode");log.info("orderId:{},respCode:{}", orderId, respCode);// 2.修改订单状态为已经支付new PaymentTransactionMapper() {@Overridepublic void updatePaymentStatus() {log.info(">>>修改订单状态为已经支付>>>>>");}}.updatePaymentStatus();// 3.调用积分接口增加积分HttpClientUtils.doPost("jifen.com", "积分接口");// 4.调用消息服务平台提示HttpClientUtils.doPost("msg.com", "调用消息接口");return true;}}
优化后
//创建各个子系统角色想·@Component@Slf4jpublic class LogService {public void logService(Map<String, String> verifySignature) {// 1.第一步打印日志信息String orderId = verifySignature.get("orderId"); // 获取后台通知的数据,其他字段也可用类似方式获取String respCode = verifySignature.get("respCode");log.info("第一个模块>>>orderId:{},respCode:{}", orderId, respCode);}}@Slf4j@Componentpublic class PaymentService {public void updatePaymentStatus() {// 2.修改订单状态为已经支付new PaymentTransactionMapper() {@Overridepublic void updatePaymentStatus() {log.info("第二个模块>>>修改订单状态为已经支付>>>>>");}}.updatePaymentStatus();}}@Component@Slf4jpublic class IntegralService {public void callIntegral() {// 3.调用积分接口增加积分HttpClientUtils.doPost("jifen.com", "积分接口");log.info("第三个模块>>>调用积分接口打印日志>>>>>");}}@Component@Slf4jpublic class MsgService {public void msgService() {log.info("第四个模块>>>调用消息模块打印日志>>>>>");}}创建门面接口@Componentpublic class PayCallbackFacade {@Autowiredprivate LogService logService;@Autowiredprivate PaymentService paymentService;@Autowiredprivate IntegralService integralService;@Autowiredprivate MsgService msgService;public boolean callbackFacade(Map<String, String> verifySignature) {logService.logService(verifySignature);paymentService.updatePaymentStatus();integralService.callIntegral();msgService.msgService();return true;}}
4、优点
松散耦合:使得客户端和子系统之间解耦,让子系统的内部模块更容易 扩展和维护;
简单易用:客户端根本不知道各个子系统内部的实现,只需要与facade 交互即可;
更好的划分访问层次:有些方法是对系统外提供的,也有些方法是内部 相互交互使用的,子系统将那些暴露给外部的功能集中到门 面中去,这样就可以实现客户端的使用,很好的隐藏了子系 统内部的实现细节。
