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

上面的摘要简单描述了一下门面设计模式的思想,下面我们通过日常生活中的例子来帮助大家理解这一思想:大家都知道,一个电脑的主机是由很多部件组成的,比较重要的有显卡,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高级资料,涵盖了Java、Redis、MongoDB、MySQL、Zookeeper、Spring Cloud、Dubbo高并发分布式等教程,一共30G,需要自己领取。
传送门:https://mp.weixin.qq.com/s/igMojff-bbmQ6irCGO3mqA

Java中的门面设计模式及如何用代码实现的更多相关文章

  1. [ 转载 ] Java中常用的设计模式

    Java中常用的设计模式 1.单例模式 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个 ...

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

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

  3. Java基础-Java中23种设计模式之常用的设计模式

    Java基础-Java中23种设计模式之常用的设计模式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.   一.设计模式分类 设计模式是针对特定场景给出的专家级的解决方案.总的来说设 ...

  4. Java中常用的设计模式代码与理解

    Java中常用的设计模式代码与理解 一.单例模式 1.饿汉式 (太饿了,类加载的时候就创建实例) /** * 饿汉式单例模式 */ public class HungrySingleInstance ...

  5. Java中23种设计模式(附代码样例)

    一.设计模式分类总体来说设计模式分为三大类:创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式.结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组 ...

  6. java中的策略设计模式

    本文主要讲java中的策略模式:一个可以根据不同的传入参数而具有不同行为的方法,就叫策略模式.概念可能有点不好理解,具体看下面代码: import java.util.Arrays; /** * 策略 ...

  7. java中全角半角字符的相互转换的代码

    如下内容是关于java中全角半角字符的相互转换的内容.package com.whatycms.common.util; import org.apache.commons.lang.StringUt ...

  8. 在JAVA中如何获取当前源文件名以及代码的行号

    在最近经历中,遇见了这样一个问题,如何获取当前源文件名以及代码的行号,只是了解到C语言有预定义宏__FILE__.__LINE__,它们在预处理的时候都已经确定好了,但是在JAVA中应该怎么获取输出呢 ...

  9. Java中23种设计模式--超快速入门及举例代码

    在网上看了一些设计模式的文章后,感觉还是印象不太深刻,决定好好记录记录. 原文地址:http://blog.csdn.net/doymm2008/article/details/13288067 注: ...

随机推荐

  1. jQuery---prop方法和表格全选案例

    prop方法和表格全选案例 对于布尔类型的属性,不用attr方法,应该用prop方法 prop用法跟attr方法一样 <input type="button" value=& ...

  2. contos7 用户管理相关操作命令

    # 查看用户列表 cut -d : -f 1 /etc/passwd # 查看可以登录系统的用户 cat /etc/passwd | grep -v /sbin/nologin | cut -d : ...

  3. java - GC垃圾收集器详解(一)

    概要 该图标记了在jdk体系中所使用到的垃圾收集器及对应的关系图.图片上方为年轻代的垃圾收集器而图片下方是老年代的垃圾收集器.当选择某一个区域的垃圾收集器时会自动选择另外一个区域的另一个垃圾收集器.例 ...

  4. WSO2 ESB XML定义语法(2)

    5.Proxy Service 配置 <proxy>元素用于定义Synapse代理服务. 通过基础Axis2引擎在指定的传输上创建和公开代理服务,根据标准的Axis2约定(即基于服务名称) ...

  5. PP: Learning representations for time series clustering

    Problem: time series clustering TSC - unsupervised learning/ category information is not available. ...

  6. PP: Triple-shapelet networks for time series classification

    Problem: time series classification shapelet-based method: two issues 1. for multi-class imbalanced ...

  7. C语言-无符号数与有符号数不为人知的秘密

    一.无符号数与有符号数 1.计算机中的符号位 数据类型的最高位用于标识数据的符号 -最高位为1,表明这个数为负数 -最高位为0,表明这个数为正数 #include <stdio.h> in ...

  8. SpringBoot整合RabbitMQ出现org.springframework.amqp.AmqpException: No method found for class

    @Component @RabbitListener(queues="my_fanout") public class Consumer {     @RabbitHandler  ...

  9. ASP.NET 模型验证2--验证部分属性

    在开发MVC时,模型验证非常常见,平常我们用的应该都是全验证 if(ModelState.IsValid){ //验证成功要做的事 .....} 但是有时候我们需要部分验证,比如修改用户信息时,因为更 ...

  10. HttpModule介绍

    https://cloud.tencent.com/developer/article/1347498 引言 Http 请求处理流程 和 Http Handler 介绍 这两篇文章里,我们首先了解了H ...