门面模式
一丶定义
要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行.
门面模式提供一个高层次的接口, 使得子系统更易于使用.
二丶理解
使用了一些简单的类或接口, 封装复杂的子系统, 避免子系统外部深入子系统内部, 避免过多的耦合.
注意事项, 门面类仅仅只是提供访问子系统的方法, 不参与子系统的业务逻辑. (见《设计模式之禅》 P286)
扫描二维码关注公众号,回复:
6703123 查看本文章
三丶优点
1) 减少系统间的相互依赖
2) 提高相互依赖
3) 提高安全性
四丶缺点
不符合开闭原则. 外部系统对于子系统的依赖转为依赖门面类, 与子系统无关.
五丶使用场景
1) 屏蔽模块或子系统的复杂性, 为复杂的模块或子系统提供一个供外界访问的接口.
2) 子系统相对独立--外界对子系统的访问只要黑箱操作即可, 如银行的利息
3) 预防低水平人员带来的风险扩散.
一般的做法是“画地为牢”,只能在指定的子系统中开发,然后在提供门面接口进行访问操作
六丶示例代码
1. 子系统门面
/** * 子系统的门面,屏蔽子系统的复杂性,供外部系统使用,避免外部系统深入子系统内部 * * @author TimFruit * @date 2019/5/22 9:25 */ public class SubSystemFacade { public void doSomethingA(){ ModuleA moduleA=new ModuleA(); moduleA.doSomethingA(); } public void doSomethingComplex(){ // 门面不参与子系统的业务逻辑 Context context=new Context(); // 所以在子系统内增加了一个封装类 ,调用封装类中的业务方法 context.doSomethingComplex(); } }
2. 封装类, 封装复杂的模块
/** * 封装类 * @author TimFruit * @date 2019/5/22 9:32 */ public class Context { public void doSomethingComplex(){ System.out.println("执行复杂方法..."); ModuleA moduleA=new ModuleA(); moduleA.doSomethingA(); ModuleB moduleB=new ModuleB(); moduleB.doSomethingB(); ModuleC moduleC=new ModuleC(); moduleC.doSomethingC(); } }
3. 子系统中的模块A,B,C
public class ModuleA { public void doSomethingA(){ System.out.println("ModuleA执行A事件..."); } }
public class ModuleB { public void doSomethingB(){ System.out.println("ModuleB执行B事件..."); } }
public class ModuleC { public void doSomethingC(){ System.out.println("ModuleC执行C事件..."); } }
4. 输出结果
ModuleA执行A事件...
执行复杂方法...
ModuleA执行A事件...
ModuleB执行B事件...
ModuleC执行C事件...
完整代码地址: 点击这里
学习资料:
《设计模式の禅》