设计模式12——外观模式

写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。

外观模式(Facade)

是一种结构型模式。

目录

一、概述

1.1、主要的角色:

1.2、直观的理解外观模式要干什么:

1.3、通过技术实现的角度看,对象之间关系的UML图如下:

二、使用步骤

三、简单举例

3.1、分析步骤:

 3.2、对象之间的关系用UML图表示如下:

3.3、Java实现代码如下:


一、概述

1、为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用;
2、如在维护一个遗留地大型地难维护和扩展的系统时,就可以开发一个外观模式类,把旧系统复杂的东西封装起来,来提供一个比较简单清晰的接口。

1.1、主要的角色:

主要的角色分两种:

  • 旧系统或子系统等其它可能需要被外观类组合起来的对象
  • 外观类或对象

1.2、直观的理解外观模式要干什么:

 假设以前有两种请求情形,每个请求情形都要访问多个不同的子系统,如果每次都要挨个编写访问不同子系统的代码,那么会非常麻烦,所以我们希望使用一个类对象把他们封装起来,这样再请求情形不同时会方便很多。如下:

对于上图来说,相当于外观类新增两个方法,分别访问子系统ABC和BC,也就是对应请求情形1和2,这样请求发起方不用每次都挨个调用每个子系统,而是直接调用外观类对象里已经封装好的方法即可。 

1.3、通过技术实现的角度看,对象之间关系的UML图如下:

新的方法1对应请求情形1,新的方法2对应请求情形2。

二、使用步骤

  • 先确定我们不同情形都要访问哪些对象;
  • 使用外观类对这些不同情形要访问对象的访问请求进行封装。

三、简单举例

和上面举例一样,假设现有子系统A、B和C,请求发起者经常要访问A、B和C,又或者只访问B和C。

3.1、分析步骤:

1、分析上述问题:

  • 请求发起者要访问子系统A、B和C,有两种情形:每次要不是访问A、B、C,要不就是访问B、C。
  • 那么我们也可以把这两个情形看成两次大的请求访问,这个大的请求访问由一个个单独访问子系统的请求组成。即:大请求1=访问子系统A+访问子系统B+访问子系统C;大请求2=访问子系统B+访问子系统C

2、针对问题的设计要素:

  • 旧系统或子系统等其它可能需要被外观类组合起来的对象:子系统A、B和C
  • 外观类或对象:外观类

 3.2、对象之间的关系用UML图表示如下:

3.3、Java实现代码如下:

(建议你在本地试一下,加深印象)

子系统A:

public class SubSystemA {public void operationA() {System.out.println("子系统方法A");}
}

子系统B:

public class SubSystemB {public void operationB() {System.out.println("子系统方法B");}
}

子系统C:

public class SubSystemC {public void operationC() {System.out.println("子系统方法C");}
}

外观类:

public class Facade {private SubSystemA subSystemA;private SubSystemB subSystemB;private SubSystemC subSystemC;public Facade() {subSystemA = new SubSystemA();subSystemB = new SubSystemB();subSystemC = new SubSystemC();}public void operation1() { //大请求1subSystemA.operationA();subSystemB.operationB();subSystemC.operationC();}public void operation2() { //大请求2subSystemB.operationB();subSystemC.operationC();}
}

 主程序(发起请求的类):

public class Main {public static void main(String[] args) {Facade facade = new Facade();facade.operation1(); //大请求1System.out.println("---------");facade.operation2(); //大请求2}
}

这里就不再举例了,可以把上面的Java例子复制到你本地,运行main函数试一下加深理解。这些代码都是我自己学习的时候根据一些教材手敲的,不存在bug可以直接运行。

如果觉得本文还不错,就请点个赞吧!如果有建议,也请评论指教和讨论!

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

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

相关文章

全球十大体育赛事API服务

体育赛事API汇总: Broadage全球橄榄球赛事数据Broadage全球棒球赛事数据Broadage全球篮球实时数据Broadage全球冰球赛事数据Broadage全球排球实时数据TennisApi全球网球赛事讯息Broadage全球足球实时数据棒球数据【纳米数据】

R实验 参数估计

实验目的: 掌握矩法估计与极大似然估计的求法;了解估计量的优良性准则:无偏性、有效性、相合性(一致性);学会利用R软件完成一个正态总体均值和两个正态总体均值差的区间估计;学会利用R软件完成…

为什么要学习c++?

你可能在想,“C?那不是上个时代的产物吗?” 哎呀,可别小看了这位“老将”,它在21世纪的科技舞台上依旧光芒万丈,是许多尖端技术不可或缺的基石! 1. 无可替代 c源于c语言,它贴近于硬…

mybatis新增到数据库后返回当前ID

描述 在开发中,插入一条数据并返回当前的ID的场景很多 之前用mybatisPlus自带的api非常简单,调用完save or insert之后再getId即可。 今天使用mybatis的时候也遇到了这个场景,在此记录一下。 解决问题 直接再insert标签里面表明属性 核心…

Innodb Buffer Pool缓存机制(一)一条sql的执行过程

思维导图 石墨文档:https://shimo.im/mindmaps/NJkbnZV0ePINXzkR 一、SQL的执行 执行过程: 加载缓存数据,加载id为1的记录所在的整页数据(相当于索引树的一个结点,16KB);写入更新数据的旧值到…

使用C/C++ API接口操作 Zookeeper 数据

ZooKeeper 支持 Java 和 C 的API接口。本文将介绍使用 C/C 语言客户端库的编译安装和使用入门。 一、编译安装 PS:就在上一篇文章还觉得安装和配置 jdk 、maven 麻烦,所以当时选择 apache-zookeeper-[version]-bin.tar.gz 的版本。然而,本文…

微信小程序-常用的视图容器类组件

一.组件分类 小程序中的组件也是由宿主环境提供的,开发者可以基于组件快速搭建出漂亮的页面结构。 官方把小程序的组件分为了9大类: (1) 视图容器 (2) 基础内容 (3) 表单组件 (4)导航组件 (5) 媒体组件 (6) map 地图组件 (7) canvas 画布组件 (8) 开放能力 (9) 无…

Linux:top命令的每一列的具体含义

Linux:top命令的每一列的具体含义 文章目录 Linux:top命令的每一列的具体含义图片显示top命令的概念语法显示字段的含义顶部字段第二行第三行第四行第五行每列字段的含义 图片显示 top命令的概念 top命令上一个常用的Linux命令行工具,用于实…

Gopher的Rust第一课:第一个Rust程序

经过上一章[1]的学习,我想现在你已经成功安装好一个Rust开发环境了,是时候撸起袖子开始写Rust代码了! 程序员这个历史并不算悠久的行当,却有着一个历史悠久的传统,那就是每种编程语言都将一个名为“hello, world”的示…

计算机图形学入门02:线性代数基础

1.向量(Vetors) 向量表示一个方向,还能表示长度(向量的摸)。一般使用单位向量表示方向。 向量加减:平行四边形法则、三角形法则。比卡尔坐标系描述向量,坐标直接相加。 1.1向量点乘(…

初识STM32单片机-TIM定时器

初识STM32单片机-TIM定时器 一、定时器概述二、定时器类型2.1 基本定时器(TIM6和TIM7)2.2 通用定时器(TIM2、TIM3、TIM4和TIM5)2.3 高级定时器(TIM1和TIM8) 三、定时中断基本结构和时基单元工作时序3.1 定时器基本结构3.2 预分频器时序3.3 计数器时序3.3.1 计数器有无预装时序(…

N的阶乘(高精度)

目录 题目描述 输入格式 输出格式 样例输入 样例输出 思路 参考代码 题目描述 输入正整数n,输出n! 输入格式 一个正整数n,n 3000 输出格式 输出n! 样例输入 3 样例输出 9 思路 主要就是高精度乘法的模版&#x…

“大数据建模、分析、挖掘技术应用研修班”的通知!

随着2015年9月国务院发布了《关于印发促进大数据发展行动纲要的通知》,各类型数据呈现出了指数级增长,数据成了每个组织的命脉。今天所产生的数据比过去几年所产生的数据大好几个数量级,企业有了能够轻松访问和分析数据以提高性能的新机会&am…

平方回文数-第13届蓝桥杯选拔赛Python真题精选

[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第73讲。 平方回文数&#…

低价焕新用户体验生态 京东向上增长通道宽了

5月16日,京东对外发布了其2024年第一季度财报。整体来看,相当不错,营收与净利润双双超预期。一季度,京东集团收入达到2,600亿元人民币(约360亿美元),同比增长7.0%,尤其是在持续补贴和…

实现UI显示在最上面的功能

同学们肯定遇到过UI被遮挡的情况,那如何让UI显示在最前面呢,先看效果 原理:UI的排序方式是和unityHierarchy窗口的层级顺序有关的,排序在下就越后显示,所以按照这个理论,当我们鼠标指到UI的时候把层级设置到最下层就好…

IOPS:存储芯片的“心跳”性能

IOPS,即每秒输入/输出操作数(Input/Output Operations Per Second),是一个用于计算机存储设备(如硬盘,SD Nand 、eMMC等)性能测试的量测方式,是评估存储系统性能的一个关键指标。 常见IOPS量测方…

制作Dcoker镜像

文章目录 一、Docker构建镜像的原理1、镜像分层原理2、Docker的镜像结构3、分层存储原理4、构建命令与层的关系5、最终镜像的创建 二、docker commit 构建镜像1、使用场景2、手动制作yum版的nginx镜像2.1、启动一个centos容器,安装好常用的软件以及nginx2.2、关闭ng…

如何评价GPT-4o

一:简介 GPT-4o作为OpenAI的又一里程碑式技术成果,展现了显著的技术进步和创新。以下是对GPT-4o的评价,包括与先前版本的对比分析、技术能力以及个人感受。 1、版本间的对比分析 相较于先前的GPT系列模型,GPT-4o在多个方…

Redis解决缓存一致性问题

文章目录 ☃️概述☃️数据库和缓存不一致采用什么方案☃️代码实现☃️其他 ☃️概述 由于我们的 缓存的数据源来自于数据库, 而数据库的 数据是会发生变化的, 因此,如果当数据库中 数据发生变化,而缓存却没有同步, 此时就会有 一致性问题存在, 其后果是: 用户使用缓存中的过…