设计模式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图如下:

二、使用步骤

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

三、简单举例

假设现有子系统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.mzph.cn/news/839007.shtml

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

相关文章

javaSwing购物系统项目(文档+视频+源码)

摘要 由Java swing实现的一款简单的购物程序,数据库采用的是mysql,该项目非常简单,实现了管理员对商品类型和商品的管理及用户注册登录后浏览商品、加入购物车、购买商品等功能,旨在学习Java 图形界面开发 系统实现 我们先来管理…

CF451E: Devu and Flowers(容斥原理 + 考虑反面 + golang组合模版)

题目截图 题目翻译 题目分析 正难则反,考虑所有不符合的例子 由于n很小,所以可以状态压缩二进制遍历完全部不符合例子的组合 对于不符合的例子,假设其中第i个不符合,那么就消耗掉fi 1个球 以此类推,减剩下s2个球 这时…

一剪梅-答赠云安客刘自果

当众网友看了笔者“边吸氧边动鼠标”的短视频之后,纷纷发来微信问候。其中我的远房亲戚,那个正在潜心写作数十万字的长篇纪实文学《川江向东流》的66岁贤弟刘自果(号云安客,亦称自果居士),发来微信鼓励我&a…

【Vue】性能优化

使用 key 对于通过循环生成的列表,应给每个列表项一个稳定且唯一的 key,这有利于在列表变动时,尽量少的删除和新增元素。 使用冻结的对象 冻结的对象(Object.freeze(obj))不会被响应化,不可变。 使用函…

【Linux】网络层——IP协议

欢迎来到Cefler的博客😁 🕌博客主页:折纸花满衣 🏠个人专栏:Linux 目录 👉🏻IP协议基本概念👉🏻IP的协议头格式👉🏻IP协议的网段划分五类IP地址子…

mysql数据库主从复制,搭建从库

1 期望效果 假设我们现在有两个服务器,两个服务器都有数据库,然后我们命名一个叫主数据库(Master),一个叫从数据库(Slave) 数据备份和容灾:通过主从复制,可以将主数据库…

618有什么宠物空气净化器推荐?希喂FreAir Lite宠物空气净化器真实体验

一、宠物空气净化器的必要性 掉毛季又来了,猫咪的毛发满天飞,怎么办?我家里的猫咪一到换毛季就掉满地的毛发,尤其喜欢在家里奔跑打闹,结果整个房间都是毛。为了减少家里空气中的浮毛,你都做过哪些努力呢&a…

关于「公 告」根据中华人民共和国法律,Bing 在中国内地暂停 “搜索自动建议” 功能 30 天

当我看见我们大家都这样我可放心了,我打开电脑搜索图片就发生了。 当我看见我们大家都这样我可放心了,坐等攻城狮修复。

关闭以及启动ubuntu图形界面

关闭以及启动ubuntu图形界面 文章目录 关闭以及启动ubuntu图形界面1. 关闭图形界面2. 打开图形界面 如果你误杀了Xorg进程,需要重新启动图形界面,可以按照以下步骤操作: 1. 关闭图形界面 查看当前启动的图形界面: 使用下面命令…

LeetCode刷题之HOT100之比特位计数

今天把仙剑三看完了,茂茂割肉让人无法释怀,眼泪止不住的流。长卿和紫萱的分离似乎也意味着重逢,这就是他们的宿命吧。怅然若失的感觉席卷全身,哎,做题吧。 1、题目描述 2、逻辑分析 题目要求将整数从0到此元素&#…

【GO基础】1. Go语言环境搭建

Go语言环境搭建 Go的三种安装方式Go标准包安装Windows 安装验证是否安装成功 4.Go的第一个程序 Hello World.go Go的三种安装方式 Go有多种安装方式,可以选择自己适合的。这里介绍三种最常见的安装方式: Go源码安装:这是一种标准的软件安装…

零门槛微调大模型:基于 Ludwig 低代码框架使用 LoRA 技术微调实践

一、Ludwig 介绍 自然语言处理 (NLP) 和人工智能 (AI) 的飞速发展催生了许多强大的模型,它们能够理解和生成如同人类般的文本,为聊天机器人、文档摘要等应用领域带来了革命性的改变。然而,释放这些模型的全部潜力需要针对特定用例进行微调。…

QTextEdit 控件上显示信息:

目录 1. 使用 append 方法: 2. 使用 setPlainText 方法 3.例子: 1. 使用 append 方法: 如果你希望在 QTextEdit 控件上追加显示新的信息,可以使用 append 方法。例如,当你想要追加一行新的日志信息: self.text_edit.append(&…

于ThinkPHP开发的赛事报名小程序

基于ThinkPHP开发的赛事报名微信小程序 功能包括 1、参赛公告 2、会员中心(会员注册、登录、成绩查询、资料管理、参赛记录管理) 3、个人报名和企业报名 (身份证验证防止重复报名) 4、培训报名 5、查询是否在库人员,根…

3---版本库和工作区、使用.git管理工作区的文件、HEAD指针和master的关系

一、本地仓库和工作区的概念: 1.1本地仓库——版本库: 本地仓库又称为版本库。版本库是隐藏目录.git,并不是.git所在的目录。版本库不属于工作区。我们不能手动操作.git目录及其中的文件,这样可能会直接破坏版本库。stage(暂存区…

Day21:Leetcode513.找树左下角的值 +112. 路径总和 113.路径总和ii + 106.从中序与后序遍历序列构造二叉树

LeetCode:513.找树左下角的值 解决方案: 1.思路 在遍历一个节点时,需要先把它的非空右子节点放入队列,然后再把它的非空左子节点放入队列,这样才能保证从右到左遍历每一层的节点。广度优先搜索所遍历的最后一个节点…

测试驱动编程(2)进阶单元测试(上)

文章目录 测试驱动编程(2)进阶单元测试(上)单元测试单元测试正确打开方式各类测试比较 TDD中的单元测试 测试驱动编程(2)进阶单元测试(上) 单元测试 要打造出出类拔萃的作品,你必须专注于最小的细节 单元测试正确打…

易刷多平台广告掘金挂机脚本,单号一天至少10-30+【挂机脚本+使用教程】

易刷多平台广告掘金挂机脚本,每天单号可以至少获取10-30的收益。我们提供【挂机脚本使用教程】。 项目介绍: 我们今天为大家带来的是一款多平台的掘金脚本。 这款脚本支持25个平台掘金,可以帮助您解决频繁下载其他脚本的问题。 设备需求&am…

浅谈AI大模型的数据特点和应用问题

【摘要】AI大模型的训练、推理及应用落地都需要大量的数据,其数据具有参数和数据量大、质量要求高、行业垂直属性强、资源消耗大等特点,由此带来的个人隐私泄露、数据中毒、数据篡改等数据安全风险已成为业界必须应对的重要议题。目前大模型的规模化应用…

Linux——进程信号

目录 一、信号的理解 二、信号的种类 2.1 标准信号 (1-31) 2.2 实时信号 (通常是34及以上) 三、信号的产生 3.1 用户通过终端产生信号 3.1.1 signal 函数 3.1.2 demo 测试 3.1.3 demo 现象 3.2 通过系统函数产生信号 3.2.1 demo 测试 3.3 由软件条件产生信号 3.3.1…