门面模式
一、定义
要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。
门面模式注重“统一的对象”,也就是提供一个访问子系统的接口,除了这个接口不允许有任何访问子系统的行为发生
门面模式的类图
Facade是门面角色,此角色知晓子系统的所有功能和责任,一般会将客户端发来的请求委派到相应的子系统中,没有实际的业务逻辑 ,只是一个委托类;
subsystem是子系统角色,可以同时有一个或者多个子系统,每一个子系统都不是一个单独的类,而是一个类的集合,子系统并不知道门面的存在,对于子系统而言,门面仅仅是另外一个客户端。
备忘录模式的通用源码
-
子系统
public class ClassA { public void doSomethingA(){ //业务逻辑 } }
public class ClassB { public void doSomethingB(){ //业务逻辑 } }
public class ClassC { public void doSomethingC(){ //业务逻辑 } }
-
门面对象
public class Facade { //被委托的对象 private ClassA a = new ClassA(); private ClassB b = new ClassB(); private ClassC c = new ClassC(); //提供给外部访问的方法 public void methodA(){ this.a.doSomethingA(); } public void methodB(){ this.b.doSomethingB(); } public void methodC(){ this.c.doSomethingC(); } }
二、门面模式的优点
-
减少系统的相互耦合
外界访问只能访问门面,所有的依赖都是对门面对象的依赖,与子系统无关。
-
提高了灵活性
不管子系统内部如何变化,只要不影响到门面对象,对高层模块也无影响
-
提高安全性
通过门面控制可以方法的方法,没有开通的方法,外界无法访问
三、门面模式的缺点
-
不符合开闭原则
无法通过继承覆写的方式改变门面对象,只能修改门面角色的代码,风险较大
四、门面模式的使用场景
-
为一个复杂的模块或系统提供一个供外界访问的接口
-
子系统相对独立
外界对子系统的访问只需要黑箱操作即可,无需知道内部细节
-
预防低水平人员带来的风险扩散
让对方在指定的子系统开发,然后再提供门面接口进行访问,可以降低个人代码指令对整个项目的影响风险
注意:
一个子系统可以听多个门面
一般情况下,一个子系统只需要一个门面,但当下面情况时需要多个门面
门面太过庞大
一个纯洁的门面对象已经超过200行代码是,建议拆分成多个门面,以便于后期维护和扩展。拆分时建议以功能拆分。
子系统可以提供不同的访问路径
当不同的高层模块对子系统具有不同的访问权限时,可以通过使用不同的门面控制提供不同的访问接口
门面不参与子系统的业务逻辑
当门面参与业余逻辑时,会使的子系统必须依赖门面才能被访问,违反单一职责原则,也破坏了系统的封装性