下文如有错漏之处,敬请指正
为多个复杂的子系统提供一个一致的接口,使调用端只能跟该接口进行交互,而无需关心子系统的内部细节。
(门面模式好比你要去注册公司,自己办理有很多流程,最简单的方法就是找代理注册,你跟代理注册的业务员对接,业务员帮你跟相关政府部门对接)
门面模式的重要角色:
Facade
门面角色
为多个子系统对外提供一个同一的接口,它包含了对各个子系统的引用,客户端可以通过它访问各个子系统的功能。
SubSystem
子系统角色
可以同时有一个或者多个子系统。每一个子系统都不是一个单独的类,而是一个类的集合。子系统并不知道门面的存在。对于子系统而言,门面仅仅是另外一个客户端而已。
Client
客户端角色
通过门面角色访问各个子系统的功能。
减少系统的相互依赖
如果我们不使用门面模式,外界访问直接深入到子系统内部,相互之间是一种强耦合关系,你死我就死,你活我才能活,这样的强依赖是系统设计所不能接受的,门面模式的出现就很好地解决了该问题,所有的依赖都是对门面对象的依赖,与子系统无关。
提高了灵活性
依赖减少了,灵活性自然提高了。不管子系统内部如何变化,只要不影响到门面对象,任你自由活动。
降低了子系统与客户端之间的耦合,使得子系统的变化不会影响调用它的客户类。
提高安全性
对客户端屏蔽了子系统组件,想让你访问子系统的哪些业务就开通哪些逻辑,不在门面上开通的方法,你休想访问到。
降低了大型软件系统中的编译依赖性,简化了系统在不同平台之间的移植过程,因为编译一个子系统不会影响其他的子系统,也不会影响门面对象。
需求:
客户需要去注册公司,注册公司需要5步(这里为5步,也就是有五个子系统),客户找了代理注册帮他注册(代理注册就是门面)
子系统:
package facade; public class Step1 { // 内部可能有着复杂的处理 // do1 // do2 // do3 // do...n public void fun(){ System.out.println("完成步骤一"); } }
package facade; public class Step2 { // 内部可能有着复杂的处理 // do1 // do2 // do3 // do...n public void fun(){ System.out.println("完成步骤二"); } }
package facade; public class Step3 { // 内部可能有着复杂的处理 // do1 // do2 // do3 // do...n public void fun(){ System.out.println("完成步骤三"); } }
package facade; public class Step4 { // 内部可能有着复杂的处理 // do1 // do2 // d03 // do...n public void fun(){ System.out.println("完成步骤四"); } }
package facade; public class Step5 { // 内部可能有着复杂的处理 // do1 // do2 // do3 // do...n public void fun(){ System.out.println("完成步骤五"); } }
门面:
package facade; public class Facade { // 被委托的对象,即子系统组件 private Step1 step1; private Step2 step2; private Step3 step3; private Step4 step4; private Step5 step5; public Facade() { step1 = new Step1(); step2 = new Step2(); step3 = new Step3(); step4 = new Step4(); step5 = new Step5(); } // 提供给外部访问的方法 public void todo() { step1.fun(); step2.fun(); step3.fun(); step4.fun(); step5.fun(); } public void todo1() { step1.fun(); } public void todo2() { step1.fun(); step3.fun(); } }
Client:
package facade; public class Client { public static void main(String[] args) { Facade facade = new Facade(); facade.todo(); /** * 输出结果: * 完成步骤一 * 完成步骤二 * 完成步骤三 * 完成步骤四 * 完成步骤五 */ } }
门面模式是一个很好的封装方法,一个子系统比较复杂时,比如算法或者业务比较复杂,就可以封装出一个或多个门面出来,项目的结构简单,而且扩展性非常好。还有,对于一个较大项目,为了避免人员带来的风险,也可以使用门面模式。