1.概述

有些人可能炒过股票,但其实大部分人都不太懂,这种没有足够了解证券知识的情况下做股票是很容易亏钱的,刚开始炒股肯定都会想,如果有个懂行的帮帮手就好,其实基金就是个好帮手,支付宝里就有许多的基金,它将投资者分散的资金集中起来,交由专业的经理人进行管理,投资于股票、债券、外汇等领域,而基金投资的收益归持有者所有,管理机构收取一定比例的托管管理费用。

定义:

又名门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体的细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。

外观(Facade)模式是“迪米特法则”的典型应用

2.结构

外观(Facade)模式包含以下主要角色:

  • 外观(Facade)角色:为多个子系统对外提供一个共同的接口。
  • 子系统(Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它。

3.案例

【例】智能家电控制

小明的爷爷已经60岁了,一个人在家生活:每次都需要打开灯、打开电视、打开空调;睡觉时关闭灯、关闭电视、关闭空调;操作起来都比较麻烦。所以小明给爷爷买了智能音箱,可以通过语音直接控制这些智能家电的开启和关闭。类图如下:

代码实现

package com.itheima.pattern.facade;/*** @program: design-patterns* @ClassName Light* @description: 电灯类* @author: * @create: 2023-01-23 16:46* @Version 1.0**/
public class Light {// 开灯public void on() {System.out.println("打开电灯。。。。。。");}// 关灯public void off() {System.out.println("关闭电灯。。。。。。");}
}
package com.itheima.pattern.facade;/*** @program: design-patterns* @ClassName Tv* @description: 电视机类* @author: * @create: 2023-01-23 16:47* @Version 1.0**/
public class Tv {// 打开电视public void on() {System.out.println("打开电视机。。。。。。");}// 关闭电视public void off() {System.out.println("关闭电视机。。。。。。");}
}
package com.itheima.pattern.facade;/*** @program: design-patterns* @ClassName AirCondition* @description: 空调类* @author: * @create: 2023-01-23 16:48* @Version 1.0**/
public class AirCondition {public void on() {System.out.println("打开空调。。。。。。");}public void off() {System.out.println("关闭空调。。。。。。");}
}
package com.itheima.pattern.facade;/*** @program: design-patterns* @ClassName SmartAppliancesFacade* @description: 外观类:用户主要和该类对象进行交互* @author: * @create: 2023-01-23 16:50* @Version 1.0**/
public class SmartAppliancesFacade {// 聚合电灯、电视机、空调对象private Light light;private Tv tv;private AirCondition airCondition;public SmartAppliancesFacade() {this.light = new Light();this.tv = new Tv();this.airCondition = new AirCondition();}public void say(String msg) {if (msg.contains("打开")) {on();} else if (msg.contains("关闭")) {off();} else {System.out.println("输入的信息有误!");}}private void off() {light.off();tv.off();airCondition.off();}private void on() {light.on();tv.on();airCondition.on();}
}
package com.itheima.pattern.facade;/*** @program: design-patterns* @ClassName Client* @description: 测试类* @author: * @create: 2023-01-23 17:58* @Version 1.0**/
public class Client {public static void main(String[] args) {// 创建智能音响对象SmartAppliancesFacade facade = new SmartAppliancesFacade();facade.say("打开家电");System.out.println("=========================");facade.say("关闭家电");}
}

4.使用场景

  • 对分层结构系统构建时,使用外观模式定义子系统中每层的入口点可以简化子系统之间的依赖关系。
  • 当一个复杂系统的子系统很多时,外观模式可以为系统设计一个简单的接口供外界访问。
  • 当客户端与多个子系统之间存在很大的联系时,引入外观模式可将它们分离,从而提高子系统的独立性和可移植性。

5.源码解析

使用tomcat作为web容器时,接收浏览器发送过来的请求,tomcat会将请求信息封装成ServletRequest对象,如下图①处对象。但是大家想想ServletRequest是一个接口,它还有一个子接口HttpServletRequest,而我们知道该request对象肯定是一个HttpServletRequest对象的子实现类对象,到底是哪个类的对象呢?可以通过输出request对象,我们就会发现是一个名为RequestFacade的类的对象。


RequestFacade类就使用了外观模式。先看结构图:

为什么在此处使用外观模式呢?

定义 RequestFacade 类,分别实现 ServletRequest ,同时定义私有成员变量 Request ,并且方法的实现调用 Request 的实现。然后,将 RequestFacade上转为 ServletRequest 传给servlet 的 service 方法,这样即使在 servlet 中被下转为 RequestFacade ,也不能访问私有成员变量对象中的方法。既用了 Request ,又能防止其中方法被不合理的访问。

结构型模式-外观模式相关推荐

  1. Java设计模式之结构型:外观模式

    一.什么是外观模式: 外观模式通过对客户端提供一个统一的接口,用于访问子系统中的一群接口.使用外观模式有以下几点好处: (1)更加易用:使得子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要 ...

  2. JavaScript设计模式(三):结构型设计模式-外观模式、适配器模式、代理模式、装饰者模式、桥接模式、组合模式、享元模式

    JavaScript设计模式 - 结构型设计模式 套餐服务-外观模式 外观模式(Facade) 水管弯弯-适配器模式 适配器模式(Adapter) 适配异类框架 参数适配 牛郎织女-代理模式 代理模式 ...

  3. Java设计模式之结构型:组合模式

    前言: 我们对于上面两幅图片肯定非常熟悉,这两幅图片我们都可以看做是一个文件结构,对于这样的结构我们称之为树形结构.在数据结构中我们知道可以通过调用某个方法来遍历整个树,当我们找到某个叶子节点后,就可 ...

  4. Java设计模式之结构型:代理模式

    前言: 我们一般在租房子时会去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做:再比如我们打官司需要请律师,因为律师在法律方面有专长,可以替我们进行操作,表达我们 ...

  5. Java设计模式之结构型:桥接模式

    一.什么是桥接模式: 桥接,顾名思义,就是用来连接两个部分,使得两个部分可以互相通讯,桥接模式的作用就是为被分离的抽象部分和实现部分搭桥.在现实生活中一个物品在搭配不同的配件时会产生不同的动作和结果, ...

  6. 《设计模式详解》结构型模式 - 外观模式

    外观模式 5.5 外观模式 5.5.1 概述 5.5.2 结构 5.5.3 案例 5.5.4 使用场景 5.5.5 Tomcat 源码 完整的笔记目录:<设计模式详解>笔记目录,欢迎指点! ...

  7. 设计模式(18):结构型-享元模式(Flyweight)

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

  8. 结构型-享元模式-02-实例实现(围棋)

    结构型-享元模式-02-实例实现 1. 棋子抽象类(享元抽象类): 2. 白棋子(具体享元类): 3. 黑棋子(具体享元类): 4. 棋子坐标类(外部状态) 5. 享元工厂类 6. 客户端测试 7. ...

  9. 设计模式(装饰者模式外观模式代理模式)

    目录 装饰者模式 介绍 实现 外观模式 介绍 实现 代理模式 介绍 实现 装饰者模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设 ...

  10. php门面理解,php 门面模式(外观模式)

    header("content-type:text/html;charset=utf-8"); // ==================php 门面模式(外观模式) ====== ...

最新文章

  1. java Scanner具有神奇的作用可惜大部分java开发人员不知
  2. Linux突然连不上网,ping不通百度,连不上MobaXterm
  3. SpringBoot 上传限制
  4. 扩展方法必须在非泛型静态类中定义
  5. Samba服务器(一):windows访问samba服务器共享文件的简单实现(图文并茂)
  6. Maven项目启动时如何查找默认的显示页面
  7. centos7设置mongodb远程连接(亲测)
  8. c语言中do有什么作用,C语言中do while语句的用法是什么?_后端开发
  9. AtomicReference
  10. 简单几行javascript代码,实现动态倒计时功能
  11. 论文笔记--知识表示学习研究进展-2016
  12. CSS3 transform 属性
  13. 20行代码实现网页图片抓取。(待完善
  14. xmind编写测试用例
  15. 带你快速入门计算机网络模型与5G协议!!
  16. 认识电脑键盘附加快捷键
  17. Python中机器学习模型的几种保存方式
  18. CentOS上安装 Docker-CE以及Docker 加速器配置
  19. pil对图像加透明 python_关于python:如何使用PIL将透明png图像与另一个图像合并...
  20. Jetson nano/nx通过网线连接电脑实现远程控制

热门文章

  1. 【ESP32_8266_WiFi (二)】接入点模式、无线终端模式
  2. Spring boot自定义拦截器和拦截器重定向配置简单介绍~!
  3. 二、肺癌检测-LUNA数据集下载和介绍
  4. 下拉 html 实现原理,百度搜索下拉框实现技术原理分析
  5. 佳能3000系列打印机打开打印机wps连接路由器
  6. 位、比特(bit)、字节(Byte)区别与关系
  7. 企业管理需要的启示:没有任何借口
  8. JAVAWEB之小说书城项目
  9. [UE]模块无法被加载,因此插件加载失败。可能存在系统错误,或模块未能正确设置
  10. CSS3实现32种基本图形