一、模式介绍
外观模式(Facade Pattern)是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。
隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。
意图:为子系统中的一组接口提供一个一致的界面。
图 用户订单管理
商城系统,当用户创建订单的时候,支付系统处理支付,商品系统设置商品库存,配送系统处理发货,订单系统来生产订单数据。一个“下单”操作需要这几个系统同时工作,内部业务流程会比较复杂。 我们借助外观模式,创建一个响应用户订单操作接口的外观类,当用户执行操作时,只需调用相关接口就可以。 商城其他系统的协调及业务处理由外观类进行管理。
图 外观模式UML图
1.1 代码说明
需求描述:证券公司研报管理平台,分析师在提交一份研报后,系统需要对研报进行合规检查,合规检查通过后,需要使这篇研报进入审批流程,最后需要短信通知用户,表明研报提交成功。
图 研报系统相关类
public class FacadeTest {
/** 合规系统 */
static class CheckService {
/** 合规检查 */
public boolean check(String report) {
if (report == null) return false;
return report.length() % 2 == 0;
}
}
/** 审批流系统 */
static class FlowService {
public void createFlow(String report) {
System.out.println("《" + report + "》进入审批流程");
}
}
static class SmsService {
public void sendSms(String report, boolean isOk) {
if(isOk) System.out.println("恭喜您,您的报告《" + report + "》提交成功");
else System.out.println("您的报告《" + report + "》合规检查不通过");
}
}
static class ReportService {
private CheckService checkService = new CheckService();
private FlowService flowService = new FlowService();
private SmsService smsService = new SmsService();
public void submitReport(String report) {
boolean check = checkService.check(report);
if (check) {
flowService.createFlow(report);
}
smsService.sendSms(report,check);
}
}
public static void main(String[] args) {
ReportService reportService = new ReportService();
reportService.submitReport("炒股不能实现财富自由");
System.out.println("----------------");
reportService.submitReport("撸起袖子加油干!");
System.out.println("----------------");
reportService.submitReport("美股疯长!");
//运行结果
//《炒股不能实现财富自由》进入审批流程
//恭喜您,您的报告《炒股不能实现财富自由》提交成功
//----------------
//《撸起袖子加油干!》进入审批流程
//恭喜您,您的报告《撸起袖子加油干!》提交成功
//----------------
//您的报告《美股疯长!》合规检查不通过
}
}
1.2 优缺点
优点:1)实现类子系统与客户端直接松耦合关系。
2)客户端屏蔽了子系统组件,使得子系统使用起来更加容易。
缺点:1)不符合开闭原则,扩展子系统时,需要做出相应修改。
2)子系统扩展风险,系统内部扩展子系统时,容易产生风险。
二、应用场景
1)为复杂的模块或子系统提供外界访问的模块。
2)Java 三层开发模式。
3)维护一个大型遗留系统,可能这个系统已经非常难以维护和扩展,但又包含非常重要的功能,为其开发一个外观类,以便新系统与其交互。