美文网首页
Java中的门面设计模式

Java中的门面设计模式

作者: 青春埋在这 | 来源:发表于2020-02-25 12:37 被阅读0次

    门面设计模式又叫外观设计模式,其核心思想正如其字面意思,向用户提供一个门户,用户只需要访问这个门户来获取他们想要的数据,无需管理这个门户内部的构成,也无需知道里面的运行流程等等,对于开发者来说,使用门面模式,我们可以只向用户提供他们想要的东西,而不要暴露所有的信息。

    上面的摘要简单描述了一下门面设计模式的思想,下面我们通过日常生活中的例子来帮助大家理解这一思想:大家都知道,一个电脑的主机是由很多部件组成的,比较重要的有显卡,CPU,主板,网卡,声卡等。如果我们需要使用计算机,那么我们就需要让他们协调运作,比如简单的开机动作,我们需要开启这些部件,但是在实际的操作中,我们只需要按一下开机键,电脑就启动了。这个开机键就是电脑门面,我们只需要向这个门面发送指令,计算机的内部就就会自动运行一系列操作去启动所有的部件,而不需要我们手动一个一个的去启动。而且最关键的是,计算机只向我们暴露了一个开关,而没有将其中的部件暴露给我们,增加了其安全性,当计算机的启动流程改变(操作扩展)时,用户是感觉不到的。下面我们就将上面的举例转换成代码的实现吧!主板的启动和关闭:

    public class MainBoard {

      public void start(){    System.out.println("main

    board is open");  }    public void end(){    System.out.println("main

    board is close");  }}

    显卡的启动和关闭:

    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();  }}

    运行结果:

    main board is open

    net card is open

    video card is open

    我们只需要调用门面对象的启动方法,就相当于调用了三个部件的启动方法,我们无需知道门面你不是怎么调用的,而且,如果电脑的组件进行了扩展,我们只需要在门面类中进行功能的扩展就可以了,客户是感觉不到的。

    在上面的代码中,我们发现门面类里只调用了启动的方法,没有关闭的方法给我们调用,这就是门面设计模式的另一个优势,它可以将不必要对客户开放的方法隐藏起来,以保证安全性。

    例如在tomcat中,当执行doGet或者doPost的时候,其中的参数request和response已经是门面类,因为tomcat在这之前,会调用:

    filterChain.doFilter(request.getRequest(), response.getResponse())

    而这两个参数的源码如下:

    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进阶学习材料和BAT面试题,需要资料的请加QQ群:731611386就能领取2019年java进阶学习资料和BAT面试题以及《Effective Java》(第3版)电子版书籍。

    相关文章

      网友评论

          本文标题:Java中的门面设计模式

          本文链接:https://www.haomeiwen.com/subject/nxnzqhtx.html