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

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

public classMainBoard {public voidstart(){

System.out.println("main board is open");

}public voidend(){

System.out.println("main board is close");

}

}

显卡的启动和关闭:

public classVideoCard {public voidstart(){

System.out.println("video card is open");

}public voidend(){

System.out.println("video card is close");

}

}

网卡的启动和关闭:

public classNetCard {public voidstart(){

System.out.println("net card is open");

}public voidend(){

System.out.println("net card is close");

}

}

将上面的操作封装到一个门面之中:

public classFacadeInstall {privateMainBoard mainBoard;privateNetCard netCard;privateVideoCard videoCard;publicFacadeInstall(){

mainBoard= newMainBoard();

netCard= newNetCard();

videoCard= newVideoCard();

}public voidstart(){

mainBoard.start();

netCard.start();

videoCard.start();

}

}

测试类:

public classFacadeTest {public static voidmain(String[] args) {

FacadeInstall facadeInstall= newFacadeInstall();

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

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

publicHttpServletRequest getRequest() {if (facade == null) {

facade= new RequestFacade(this);

}returnfacade;

}publicHttpServletResponse getResponse() {if (facade == null) {

facade= new ResponseFacade(this);

}return(facade);

}

其实门面设计模式使用还是比较广泛的,如果shiro的核心组件SecurityManager就是一个典型的门面设计模式。

本人免费整理了Java高级资料,涵盖了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高并发分布式等教程,一共30G,需要自己领取。

java设计功能怎么实现代码_Java中的门面设计模式及如何用代码实现相关推荐

  1. java消息提示代码_JAVA中实现消息提示功能代码 .

    注(在MyEclipse中新建一个jsp文件然后把代码复制到当中即可!) String path = request.getContextPath(); String basePath = reque ...

  2. java socket 推送机制_Java中websocket消息推送的实现代码

    一.服务层 package com.demo.websocket; import java.io.IOException; import java.util.Iterator; import java ...

  3. java args用法_Java中args参数数组的用法说明代码

    本篇文章小编给大家分享一下Java中args参数数组的用法说明代码,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. main方法args参数用于接收用户 ...

  4. java 构造块_java中构造方法、普通块、静态代码块、构造块的执行顺序

    静态块.构造块.构造方法.普通块 静态块:在类中用"{}"括号括起来,并在括号前用static修饰的块为静态块;静态块在类加载时候被调用,并且在整个生命中只调用一次 同步块 使用s ...

  5. java file 相对路径 根目录修改_java中使用相对路径读取文件的写法总结 ,以及getResourceAsStream() (转)...

    https://blog.csdn.net/my__sun_/article/details/74450241 读取文件的写法,相对路径 在当前的目录结构中读取test.txt的有四种写法 简单粗暴的 ...

  6. java list 去重 相同的相加_Java 中的数据流和函数式编程 | Linux 中国

    学习如何使用 Java 8 中的流 API 和函数式编程结构.-- Marty Kalin 当 Java SE 8(又名核心 Java 8)在 2014 年被推出时,它引入了一些更改,从根本上影响了用 ...

  7. java 怎么把list流化_Java 中的数据流和函数式编程

    原标题:Java 中的数据流和函数式编程 学习如何使用 Java 8 中的流 API 和函数式编程结构.-- Marty Kalin(作者) 当 Java SE 8(又名核心 Java 8)在 201 ...

  8. java命令模式_Java中的命令设计模式

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

  9. java 设计模式 示例_Java中的访问者设计模式–示例教程

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

最新文章

  1. 软件体系架构模式之一什么是软件架构模式
  2. WPF QuickStart系列之样式和模板(Style and Template)
  3. 如何为windows服务添加安装程序(转)
  4. JAVA IO修改文本内容
  5. Gunicorn 0.17 发布,Python HTTP 服务器
  6. sql语句截取字符串
  7. coolpro2 剪切并淡出
  8. 交易偏见--《别做正常的傻瓜》摘记2
  9. 草坪护理产品行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  10. Postman中tests的基本使用
  11. 三角形边长求高的c语言函数公式,各种三角形边长的计算公式-三角形三边公式...
  12. Jmeter中大佬的大集合
  13. 程序设计思维与实践 Week14 限时大模拟A - 猫睡觉问题
  14. 【华为机试真题Python】工厂流水线调度
  15. nps p2p穿透中遇到的NAT类型过低的问题解决
  16. 生活随记-交易难的原因
  17. java细节知识点学习1
  18. 外观模式 Facade
  19. 基于Java的Minecraft游戏后端自定义插件 06绘制简单粒子特效与BukkitRunable定时器
  20. CSS层级小技巧!如何在滚动时自动添加头部阴影?

热门文章

  1. Windows窗口API
  2. 【C语言程序设计】实验 4
  3. Beagle填充之坑ERROR: REF field is not a sequence of A, C, T, G, or N characters at
  4. Hiho303周 H国的身份证号码I
  5. 自动驾驶 | SIL测试简单介绍
  6. CC(标准)版D碟收藏指南(二)
  7. 中级微观经济学:Chap 31 行为经济学
  8. 热烈庆祝下Air2.0版Rock506Dock beta1.0上线~
  9. struct class
  10. 2019余额不足,技术人如何高效充电?