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

显卡的启动和关闭:

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就是一个典型的门面设计模式。

作者:Mazin

https://my.oschina.net/u/3441184/blog/889706

分享一份 2019 最新 Java 架构师学习资料

- END -

推荐阅读:

1、为什么微服务一定要有网关?

2、Spring Boot 2.2.2 发布,新增 2 个新特性!

3、Spring 最常用的 7 大类注解,史上最强整理

4、注意了,千万不要在MySQL中使用UTF-8

5、歪国人整理的 2019 年 Java 开发路线图!

关注Java技术栈公众号在后台回复:设计模式,可获取一份栈长整理的最新 Java 设计模式干货。

点击「阅读原文」和栈长学更多~  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值