前言
提到设计模式,可能有的人就会觉得很抽象,很高深的样子,其实设计模式并没有想象中的那么高深,很多设计模式我们天天都在用,只是自己不知道自己用到的就是设计模式而已。设计模式也是在开发的基础上总结归纳得出来的,并不是什么新颖的东西,只是一种经验的总结而已,如果有觉得设计模式高深莫测的朋友,那么看看这篇门面模式我想一定会改变你的观点,门面模式会让你发出“这也是设计模式?”的感慨。
什么是门面模式
门面模式(Facade Pattern),又被称之为外观模式。门面模式提供了一个统一的接口,这个接口可以用来访问相同子系统或者不同子系统之中的一群接口。门面模式使得系统更加容易调用,属于结构型模式。
门面模式角色
门面模式主要包含了两种角色:
- 外观角色(Facade):也称门面角色,系统对外统一接口。
- 子系统角色(SubSystem):可以同时有一个或者多个SubSystem。每个SubSystem都不是一个单独的类,而是一个类的集合。SubSystem并不知道Facade的存在,对于SubSystem而言,Facade也仅仅只是一个调用者(客户端)而已。
门面模式示例
好了,装逼时刻又到了:Talk is cheap,Show you the code,先看一个非常简单的例子。
1、新建2个子系统角色类,每个类中都只有一个方法:
package com.zwx.design.pattern.facade;
public class SubSystemA {
public void doSomething(){
System.out.println("I'm A");
}
}
package com.zwx.design.pattern.facade;
public class SubSystemB {
public void doSomething(){
System.out.println("I'm B");
}
}
2、新建一个门面类来统一提供对外调用子系统接口的方法:
package com.zwx.design.pattern.facade;
public class SimpleFacade {
private SubSystemA systemA = new SubSystemA();
private SubSystemB systemB = new SubSystemB();
public void doA(){
this.systemA.doSomething();
}
public void doB(){
this.systemB.doSomething();
}
}
3、最后新建测试类:
package com.zwx.design.pattern.facade;
public class TestSimpleFacade {
public static void main(String[] args) {
SimpleFacade simpleFacade = new SimpleFacade();
simpleFacade.doA();
simpleFacade.doB();
}
}
测试类中不会直接调用子系统,而是通过门面类来进行统一调用。
看完这个例子,大家应该会发出感慨了,这种方式我们天天都在用,原来居然就是设计模式之一的门面模式。
还有另一种写法就是假如我们一个流程里面需要很多个子系统的方法一起调用才能完成,那么这时候我们就可以对上面的示例进行改造了,如下我们再新建一个门面类:
package com.zwx.design.pattern.facade;
public class Facade {
private SubSystemA systemA = new SubSystemA();
private SubSystemB systemB = new SubSystemB();
public void doAB(){
this.systemA.doSomething();
this.systemB.doSomething();
}
}
然后测试类中就可以直接通过调用一个方法达到调用多个子系统的方法完成一个流程:
package com.zwx.design.pattern.facade;
public class TestFacade {
public static void main(String[] args) {
Facade facade = new Facade();
facade.doAB();
}
}
门面模式应用场景
门面模式一般可以适用于以下两种场景:
1、当各个子系统越来越复杂时,可以提供门面接口来统一调用
2、构建多层系统结构时,利用门面对象来作为每层的入口,这样可以简化分层间的接口调用
门面模式优缺点
优点:
- 1、简化了调用过程,调用者无需深入了解子系统,以防给子系统带来风险
- 2、减少了系统间的依赖,松散了耦合度
- 3、将系统划分了层次,提高了安全性
- 4、遵循了迪米特法则(即最少知道原则)
缺点:
- 1、当增加子系统或者扩展子系统功能时,可能容易带来未知风险
- 2、不符合开闭原则
- 3、某些情况下可能会违背单一职责原则
总结
本文主要分析了门面模式及其示例,希望通过本文可以让大家体会到设计模式并没有想象中的那么高深,学习设计模式主要是体会其中的思想,然后在适当的时候可以提升我们运用到我们代码中。
请关注我,和孤狼一起学习进步。