设计模式之外观模式【结构型模式】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档> 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您:
想系统/深入学习某技术知识点…
一个人摸索学习很难坚持,想组团高效学习…
想写博客但无从下手,急需写作干货注入能量…
热爱写作,愿意让自己成为更好的人…

文章目录

  • 前言
  • 一、概述
  • 二、结构
  • 三、案例
  • 四、使用场景
  • 五、源码解析
  • 总结


前言

一、概述
二、结构
三、案例
四、使用场景
五、源码解析


一、概述

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

定义:

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

​ 外观(Facade)模式是“迪米特法则”的典型应用
在这里插入图片描述

二、结构

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

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

三、案例

【例】智能家电控制

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

//灯类
public class Light {public void on() {System.out.println("打开了灯....");}public void off() {System.out.println("关闭了灯....");}
}//电视类
public class TV {public void on() {System.out.println("打开了电视....");}public void off() {System.out.println("关闭了电视....");}
}//控制类
public class AirCondition {public void on() {System.out.println("打开了空调....");}public void off() {System.out.println("关闭了空调....");}
}//智能音箱
public class SmartAppliancesFacade {//聚合电灯、电视机、空调对象private Light light;private TV tv;private AirCondition airCondition;public SmartAppliancesFacade() {light = new Light();tv = new TV();airCondition = new AirCondition();}//通过语音控制public void say(String message) {if(message.contains("打开")) {on();} else if(message.contains("关闭")) {off();} else {System.out.println("我还听不懂你说的!!!");}}//起床后一键打开电器private void on() {System.out.println("起床了");light.on();tv.on();airCondition.on();}//睡觉一键关闭电器private void off() {System.out.println("睡觉了");light.off();tv.off();airCondition.off();}
}//测试类
public class Client {public static void main(String[] args) {//创建外观对象(智能音箱)SmartAppliancesFacade facade = new SmartAppliancesFacade();//客户端直接与外观对象进行交互facade.say("打开家电");facade.say("关闭家电");}
}

在这里插入图片描述

好处:

  • 降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类。
  • 对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易。

缺点:

  • 不符合开闭原则,修改很麻烦

四、使用场景

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

五、源码解析

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

在这里插入图片描述
RequestFacade类就使用了外观模式。先看结构图:
在这里插入图片描述
为什么在此处使用外观模式呢?

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


总结

以上就是设计模式之外观模式【结构型模式】的相关知识点,希望对你有所帮助。
积跬步以至千里,积怠惰以至深渊。时代在这跟着你一起努力哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/334819.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Camunda ServiceTask

一:Java class Java class实现JavaDelegate接口,只需要配置类的全限定名即可,不需要被Spring容器管理。 public class JavaClassServiceTask implements JavaDelegate {Overridepublic void execute(DelegateExecution execution) throws …

6.1 截图工具HyperSnap6简介

图片是组成多媒体作品的基本元素之一,利用图片可以增强多媒体作品的亲和力和说说服力。截取图片最简单的方法是直接按下键盘上的“PrintScreen”键截取整个屏幕或按下“AltPrintScreen”组合键截取当前活动窗口,然后在画笔或者其它的图片处理软件中进行剪…

Hyperledger Fabric 管理链码 peer lifecycle chaincode 指令使用

链上代码(Chaincode)简称链码,包括系统链码和用户链码。系统链码(System Chaincode)指的是 Fabric Peer 中负责系统配置、查询、背书、验证等平台功能的代码逻辑,运行在 Peer 进程内,将在第 14 …

业界首款PCIe 4.0/5.0多通道融合接口SSD技术解读

之前小编写过一篇文章劝大家不要碰PCIe 5.0 SSD,详细内容,可以再回顾下: 扩展阅读:当下最好不要入坑PCIe 5.0 SSD 如果想要进一步了解PCIe 6.0,欢迎点击阅读: 浅析PCIe 6.0功能更新与实现的挑战 PCIe 6.…

基于Springboot的计算机学院校友网(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的计算机学院校友网(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spring…

DDPM具体步骤

一、前向过程(扩散过程) 在前向过程中,模型逐步向数据添加噪声,直到数据完全转化为无结构的噪声 这个过程可以用马尔可夫链来描述,其中每一步都向数据添加一小部分高斯噪声 假设我们有一个初始数据分布 p(x0​)&…

Typescript 中创建对象的方式

1.type type MyObj {a: string;b: number;c: () > number; }; 2.interface interface MyObj {a: string;b: number;c: () > number; } 3. class class MyObj {a:string;b:number;c:()>number } // Error: Property staticProperty does not exist on type M.

PostGIS学习教程二十:3-D

PostGIS学习教程二十:3-D 注意:本文介绍许多PostGIS2.0及更高版本才支持的功能。 文章目录 PostGIS学习教程二十:3-D一、3-D几何图形二、3-D函数三、N-D索引 一、3-D几何图形 到目前为止,我们一直在处理2-D几何图形(…

【RH850U2A芯片】RAM and Flash介绍

目录 前言 正文 1.RH850-U2A16芯片RAM 1.1 用户使用RAM类型及大小 1.2 各类RAM起始地址 1.3 LRAM和CRAM的区别 1.4 RAM初始化问题 1.5 RAM使用经验 2.RH850-U2A16芯片Flash 2.1 Flash类型及大小 2.2 各类Flash的起始地址 2.3 Code Flash和Data Flash的区别 2.4 Fl…

Python基础知识:整理7 字典的定义及其相关操作

1 字典的定义 # 1. 字典的定义 # 定义字典的字面量 # {key: value, key: value, ......, key: value}# 定义字典变量 # my_dict {key: value, key: value, ......, key: value}# 定义空字典 # my_dict {} # my_dict dict()定义重复Key的字典 my_dict1 {"张三": …

Spring MVC响应结合RESTful风格开发,打造具有强大功能和良好体验的Web应用!

响应与Rest风格 1.11.1.1 环境准备步骤1:设置返回页面步骤2:启动程序测试 1.1.2 返回文本数据步骤1:设置返回文本内容步骤2:启动程序测试 1.1.3 响应JSON数据响应POJO对象响应POJO集合对象 知识点1:ResponseBody 2,Rest风格2.1 REST简介2.2 RESTful入门案…

Google Earth Engine(GEE)深度学习入门教程- GEE导出篇

GEE导出篇 官方教程:TFRecord 和地球引擎 在GEE的JS Code Editor中,我们按照我们的需要去处理对应的遥感影像,得到处理后Image影像。为了导出后读取数据,在导出前一定清楚每个波段的名称(不然没法读取)。…