门面模式
特征: 门面模式定义了一个高层接口, 让子系统更容易使用.属于结构型模式
适用场景: 子系统越来越复杂, 增加门面模式提供简单接口。
构建多层系统结构, 利用门面对象作为每层的入口, 简化层间调用
public class SubSystemA { public void doA() { System.out.println("doing A stuff"); } }
public class SubSystemB { public void doB() { System.out.println("doing B stuff"); } }
public class SubSystemC { public void doC() { System.out.println("doing C stuff"); } }
public class Facade { private SubSystemA a = new SubSystemA(); private SubSystemB b = new SubSystemB(); private SubSystemC c = new SubSystemC(); public void exchange(){ this.a.doA(); this.b.doB(); this.c.doC(); } }
public static void main(String[] args) { Facade facade = new Facade(); facade.exchange(); }
优点: 1、简化了调用过程,无需深入了解子系统, 以防给子系统带来风险
2、减少系统依赖, 松耦合
3、更好地划分访问层次, 提高了安全性
4、遵循迪米特法则(最少知道原则)
缺点: 1、当增加子系统和扩展子系统行为时, 可能容易带来未知风险
2、不符合开闭原则
3、某些情况下可能违背单一职责原则
源码中的运用: sprign中的JdbcUtils;Mybatis中的Configuration;Tomcat中的RequestFacade、ResponseFacade、StandardSessionFacade。
门面模式就是特殊的静态代理模式
门面模式: 重点在于封装;代理模式: 重点在于增强;不做增强的静态代理就是门面模式;委派模式也是一张静态代理;
门面模式有可能做成单例;工具包,如spring中的JdbcUtils