门面设计模式又叫外观设计模式,其核心思想正如其字面意思,向用户提供一个门户,用户只须要访问这个门户来获取他们想要的数据,无需管理这个门户内部的构成,也无需知道里面的运行流程等等,对于开发者来讲,使用门面模式,咱们能够只向用户提供他们想要的东西,而不要暴露全部的信息。java
上面的摘要简单描述了一下门面设计模式的思想,下面咱们经过平常生活中的例子来帮助你们理解这一思想:你们都知道,一个电脑的主机是由不少部件组成的,比较重要的有显卡,CPU,主板,网卡,声卡等。若是咱们须要使用计算机,那么咱们就须要让他们协调运做,好比简单的开机动做,咱们须要开启这些部件,可是在实际的操做中,咱们只须要按一下开机键,电脑就启动了。这个开机键就是电脑门面,咱们只须要向这个门面发送指令,计算机的内部就就会自动运行一系列操做去启动全部的部件,而不须要咱们手动一个一个的去启动。并且最关键的是,计算机只向咱们暴露了一个开关,而没有将其中的部件暴露给咱们,增长了其安全性,当计算机的启动流程改变(操做扩展)时,用户是感受不到的。下面咱们就将上面的举例转换成代码的实现吧!主板的启动和关闭:设计模式
public class MainBoard { public void start(){ System.out.println("main board is open"); } public void end(){ System.out.println("main board is close"); } }
显卡的启动和关闭:tomcat
public class VideoCard { public void start(){ System.out.println("video card is open"); } public void end(){ System.out.println("video card is close"); } }
网卡的启动和关闭:安全
public class NetCard { public void start(){ System.out.println("net card is open"); } public void end(){ System.out.println("net card is close"); } }
将上面的操做封装到一个门面之中:并发
public class FacadeInstall { private MainBoard mainBoard; private NetCard netCard; private VideoCard videoCard; public FacadeInstall(){ mainBoard = new MainBoard(); netCard = new NetCard(); videoCard = new VideoCard(); } public void start(){ mainBoard.start(); netCard.start(); videoCard.start(); } }
测试类:分布式
public class FacadeTest { public static void main(String[] args) { FacadeInstall facadeInstall = new FacadeInstall(); facadeInstall.start(); } }
运行结果:ide
main board is open
net card is open
video card is open
咱们只须要调用门面对象的启动方法,就至关于调用了三个部件的启动方法,咱们无需知道门面你不是怎么调用的,并且,若是电脑的组件进行了扩展,咱们只须要在门面类中进行功能的扩展就能够了,客户是感受不到的。 在上面的代码中,咱们发现门面类里只调用了启动的方法,没有关闭的方法给咱们调用,这就是门面设计模式的另外一个优点,它能够将没必要要对客户开放的方法隐藏起来,以保证安全性。高并发
例如在tomcat中,当执行doGet或者doPost的时候,其中的参数request和response已是门面类,由于tomcat在这以前,会调用:测试
filterChain.doFilter(request.getRequest(), response.getResponse())
而这两个参数的源码以下:this
public HttpServletRequest getRequest() { if (facade == null) { facade = new RequestFacade(this); } return facade; } public HttpServletResponse getResponse() { if (facade == null) { facade = new ResponseFacade(this); } return (facade); }
其实门面设计模式使用仍是比较普遍的,若是shiro的核心组件SecurityManager就是一个典型的门面设计模式。
本人免费整理了Java高级资料,涵盖了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高并发分布式等教程,一共30G,须要本身领取。
传送门:https://mp.weixin.qq.com/s/igMojff-bbmQ6irCGO3mqA