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

上面的摘要简单描述了一下门面设计模式的思想,下面我们通过日常生活中的例子来帮助大家理解这一思想:大家都知道,一个电脑的主机是由很多部件组成的,比较重要的有显卡,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中的门面设计模式相关推荐

  1. Java中的门面设计模式,非常有用!

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

  2. 第80节:Java中的MVC设计模式

    第80节:Java中的MVC设计模式 前言 了解java中的mvc模式.复习以及回顾! 事务,设置自动连接提交关闭. setAutoCommit(false); conn.commit(); conn ...

  3. Java中的策略设计模式

    策略设计模式是一种行为模式,其中我们有多种算法/策略来完成一项任务,所使用的算法/策略留给客户选择. 各种算法选项封装在单独的类中. 在本教程中,我们将学习在Java中实现策略设计模式. UML表示形 ...

  4. Java中的命令设计模式

    在本教程中,我们将学习命令模式,这是一种重要的行为设计模式. 它具有一些重要的应用程序,例如在文本编辑器中实现撤消/重做功能. 在命令设计模式中,有一个命令对象位于发送方和接收方对象之间. 发送者对象 ...

  5. Java中的状态设计模式–示例教程

    状态模式是行为设计模式之一 . 当对象根据其内部状态更改其行为时,将使用状态设计模式. 如果必须根据对象的状态更改其行为,则可以在对象中使用状态变量,并使用if-else条件块根据状态执行不同的操作. ...

  6. Java中的Memento设计模式-示例教程

    记忆模式是行为设计模式之一 . 当我们要保存对象的状态以便以后可以恢复时,可以使用Memento设计模式. 记忆模式用于以这种方式实现该目的,即在对象外部无法访问该对象的已保存状态数据,从而保护了已保 ...

  7. Java中的访问者设计模式–示例教程

    访客模式是行为设计模式之一 . 当我们必须对一组相似类型的对象执行操作时,将使用访问者模式. 借助访问者模式,我们可以将操作逻辑从对象移动到另一个类. 例如,假设有一个购物车,我们可以在其中添加不同类 ...

  8. Java中的策略设计模式-示例教程

    策略模式是行为设计模式之一 . 当我们对一个特定任务有多种算法,并且客户端决定在运行时使用的实际实现时,将使用策略模式. 策略模式也称为策略模式 . 我们定义了多种算法,并让客户端应用程序将算法用作参 ...

  9. Java中的迭代器设计模式–示例教程

    迭代器模式是一种行为模式,用于提供遍历一组对象的标准方式. Iterator模式在Java Collection Framework中得到了广泛使用,其中Iterator接口提供了遍历集合的方法. 根 ...

最新文章

  1. Array的javascript数据结构描述
  2. Sublime 解决目录显示为方块的问题
  3. 股东痛斥联想管理层:都是帅哥 但业绩差
  4. 特别看好高校团队的联想创投,在中科大拉开高校AI精英挑战赛大幕
  5. 求杨辉三角的前n行数据_两道简单的套公式算法题:杨辉三角
  6. 用 Tenorshare ReiBoot修复iPhone无法开机
  7. 强烈推荐一个上网以来见过的最好的学习资料网站,全部免费!
  8. 整型常量(基于百度及各处资料加上我的个人经验整理而成)
  9. JZOJ 3337. 【NOI2013模拟】wyl8899的TLE【暴力】
  10. 微信群控系统的实现原理,微信群控系统源码的核心实现代码
  11. GB/T28181平台服务器解决方案简介
  12. js正则表达式将中文标点转为英文标点
  13. 椭圆机的减肥效果怎么样
  14. pest分析和swot分析的区别
  15. 【计算机网络】 课程大作业:利用Wireshark抓包并进行分析
  16. 彻底理解安卓应用无响应机制
  17. [PTA]习题11-1 输出月份英文名
  18. leetcode日记
  19. Google AIY——据说这是技术宅最想入手的AI “玩具”?
  20. 白话 贝叶斯公式_通俗易懂!白话朴素贝叶斯

热门文章

  1. Windows窗口API
  2. css中元素横向放置,使用CSS将元素放置到右侧
  3. css语法---选择器
  4. Ubuntu 更换清华大学镜像源
  5. 解决下载图片打不开的问题
  6. Nye Lubricants UNIFLOR RHEOLUBE NYOGEL
  7. 数学统计:均值、标准差、方差、协方差
  8. 网络协议 — TCP协议与HTTP协议
  9. 初识Excel的IF, IFERROR, MATCH, COUNTA公式
  10. Android开发五年,从月薪13K到年薪60W,我只用了三个月!