设计模式是面向问题、场景而总结产生的设计思路。是解决问题的套路。23 种经典的设计模式。它们又可以分为三大类:创建型、结构型、行为型。
结构型 包含了 代理模式、 桥接模式、 装饰器模式、适配器模式、门面模式、组合模式、 享元模式。
门面模式
门面模式(Facade Design Pattern)又称为外观模式。
当子系统越来越复杂,增加外观模式提供了一个统一的接口,用来访问子系统中的一群接口。适用于构建多层系统结构,利用外观对象作为每层的入口,简化层间调用。通俗的说, 就是设计一个类,专门用于对外服务的, 门面对象是外界访问子系统内部的专用通道。
通过门面模式,简化了调用过程,无需了解深入子系统,防止带来风险。减少系统依赖、松散耦合,更好的划分访问层次,符合迪米特法则,即最少知道原则。
1.子系统
假设有三个子系统,各自负责写库、通知、日志,如果将这些细节接口暴露给客户端,会给客户端的调用逻辑带来复杂性和出错风险。
public class SubSystem1 {
public boolean dbtransaction() {
System.out.println("做一些数据库事务");
return true;
}
}
public class SubSystem2 {
public void notification() {
System.out.println("做一些消息通知");
}
}
public class SubSystem3 {
public void log() {
System.out.println("做一些消息日志处理");
}
}
2. 大管家
大管家统一提供一个简单接口,封装了处理逻辑,简化了接口服务的调用。
public class FacadeService {
private SubSystem1 system1 = new SubSystem1();
private SubSystem2 system2 = new SubSystem2();
private SubSystem3 system3 = new SubSystem3();
public void apply() {
system3.log();
boolean success = system1.dbtransaction();
if(success)
system2.notification();
}
}
3. 组合在一起
将这些服务提供在一起后客户端的调用更简单,也不必知道内部接口的细节。
public class Main {
public static void main(String[] args) {
FacadeService service = new FacadeService();
service.apply();
}
}
运行结果:
做一些消息日志处理
做一些数据库事务
做一些消息通知
总结
门面模式提供了统一调用接口,就像一个大管家提供了一站式服务。门面模式可以解决接口调用易用性的问题、减轻客户端多次调用接口所带来的的性能问题、以及解决分布式事务——将多个事务整合在一起。
设计模式系列在github上有一个开源项目,主要是本系列博客的demo代码。https://github.com/forestnlp/designpattern
如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。
您的支持是对我最大的鼓励。