【设计模式-3.1】结构型——外观模式
说明:本文介绍设计模式中结构型设计模式中的,外观模式;
亲手下厨还是点外卖?
外观模式属于结构型的设计模式,关注类或对象的组合,所呈现出来的结构。以吃饭为例,在介绍外观模式之前,通过这个例子,谈谈我对面向对象的理解。
吃饭,是一个功能,可以有两种方式来实现,对应的正是面向过程和面向对象的思想。
第一种,自己买菜买工具(初始化变量),做饭(实现方法),吃饭(实现方法),洗碗卖工具(释放内存空间);
第二种,点外卖(手机对象),做饭(店家对象),送外卖(外卖员对象),吃饭(顾客对象);
通过比较,就很容易理解两种设计思想了。实际上就是实现功能的思路,一种是将功能分为一步一步,逐步实现(面向过程);一种是将属性和行为封装为对象,让功能的实现在对象的交互中实现。
这两种解题思路,没有高低之分,也没有哪种更优秀,殊途同归。
外观模式
以上面吃饭为例,面向对象设计,如下:
(Vegetables,蔬菜对象,提供蔬菜)
/*** 蔬菜对象*/
public class Vegetables {public void provide() {System.out.println("提供蔬菜");}
}
(Cook,厨师对象,做饭)
/*** 厨师*/
public class Cook {public void cook() {System.out.println("做饭");}
}
(用餐者对象,吃饭,吃完饭洗碗)
/*** 食客*/
public class Diners {public void eat() {System.out.println("吃饭");}public void wash() {System.out.println("洗碗");}
}
(Client,客户端,演示吃饭功能)
/*** 客户端*/
public class Client {public static void main(String[] args) {new Vegetables().provide();new Cook().cook();new Diners().eat();new Diners().wash();}
}
(执行结果)
通过上面的例子,我们可以看出,实现一个功能涉及到多个对象的配合,那为什么我们不把这些对象中对应的功能(方法)绑定到一起,合并成一个业务层面上的功能(吃饭)呢?
如下:
(EatFacede,吃饭外观类,捆绑各个对象的方法,实现吃饭功能)
/*** 吃饭外观类*/
public class EatFacede {/*** 蔬菜对象*/private Vegetables vegetables;/*** 厨师对象*/private Cook cook;/*** 食客对象*/private Diners diners;public EatFacede() {vegetables = new Vegetables();cook = new Cook();diners = new Diners();}/*** 吃饭*/public void eat() {vegetables.provide();cook.cook();diners.eat();diners.wash();}
}
(Client,客户端,演示吃饭流程,只需要调用吃饭外观类中的eat()方法即可)
/*** 客户端*/
public class Client {public static void main(String[] args) {new EatFacede().eat();}
}
(执行结果)
以上就是结构型设计模式中,外观模式的内容。这种将繁多的对象方法合并到一起,实现一项“大功能”的思路与生活经验非常贴合。例如开公司,公司的合伙人一边有资金,一边有技术,聚在一起开公司干大事。
另外,在三层框架开发中,Controller层只管调用Service层中的一个方法,而在Service层中,该方法内可能去调用了其他Bean对象的方法,最终才实现了本Service中的这个功能,这也是外观模式的体现。
总结
本文参考《设计模式的艺术》、《秒懂设计模式》两书
相关文章:

【设计模式-3.1】结构型——外观模式
说明:本文介绍设计模式中结构型设计模式中的,外观模式; 亲手下厨还是点外卖? 外观模式属于结构型的设计模式,关注类或对象的组合,所呈现出来的结构。以吃饭为例,在介绍外观模式之前࿰…...

flutter学习-day2-认识flutter
📚 目录 简介特点架构 框架层引擎层嵌入层 本文学习和引用自《Flutter实战第二版》:作者:杜文 1. 简介 Flutter 是 Google 推出并开源的移动应用开发框架,主打跨平台、高保真、高性能。开发者可以通过 Dart 语言开发 App&#…...

解决selenium使用.get()报错:unknown error: unsupported protocol
解决方法 将原来的: url "https://www.baidu.com" browser.get(url)替换为: url "https://www.baidu.com" browser.execute_script(f"window.location.replace({url});") # 直接平替 .get()问题解析 之前运行都是正…...

关于加密解密,加签验签那些事
面对MD5、SHA、DES、AES、RSA等等这些名词你是否有很多问号?这些名词都是什么?还有什么公钥加密、私钥解密、私钥加签、公钥验签。这些都什么鬼?或许在你日常工作没有听说过这些名词,但是一旦你要设计一个对外访问的接口ÿ…...

容器重启后,Conda文件完整保存(虚拟环境、库包),如何重新安装conda并迁移之前的虚拟环境
Vim安装 容器重启后默认是vi,升级vim,执行命令 apt install -y vim安装 Anaconda 1. 下载Anaconda 其他版本请查看Anaconda官方库 wget https://mirrors.bfsu.edu.cn/anaconda/archive/Anaconda3-2023.03-1-Linux-x86_64.sh --no-check-certificate…...

gitee对接使用
1.创建一个文件夹 2.进入Gitee接受对方项目编辑 3.打开终端初始化一开始创建的文件夹 git init 3.1打开终端 3.2输入git.init 4.克隆对方的项目 4.1进入Gitee复制对方项目的路径 4.2在编辑器终端内克隆对方项目 git clone 网址 如此你的编辑器就会出现对方的项目 …...

C语言中的一维数组与二维数组
目录 一维数组数组的创建初始化使用在内存中的存储 二维数组创建初始化使用在内存中的存储 数组越界 一维数组 数组的创建 数组是一组相同类型元素的集合。 int arr1[10]; char arr3[10]; float arr4[10]; double arr5[10];下面这个数组能否成功创建? int count…...

【Linux】地址空间
本片博客将重点回答三个问题 什么是地址空间? 地址空间是如何设计的? 为什么要有地址空间? 程序地址空间排布图 在32位下,一个进程的地址空间,取值范围是0x0000 0000~ 0xFFFF FFFF 回答三个问题之前我们先来证明地址空…...

作为一个产品经理带你了解Axure的安装和基本使用
1.Axure的简介 Axure是一种强大的原型设计工具,它允许用户创建交互式的、高保真度的原型,以及进行用户体验设计和界面设计。Axure可以帮助设计师和产品经理快速创建和共享原型,以便团队成员之间进行沟通和反馈。Axure提供了丰富的交互组件和功…...

接口测试总结及其用例设计方法
接口测试的总结文档 第一部分:主要从问题出发,引入接口测试的相关内容并与前端测试进行简单对比,总结两者之前的区别与联系。但该部分只交代了怎么做和如何做?并没有解释为什么要做? 第二部分:主要介绍…...

2023团体程序设计天梯赛——模拟赛和总决赛题
M-L1-1 嫑废话上代码 Linux 之父 Linus Torvalds 的名言是:“Talk is cheap. Show me the code.”(嫑废话,上代码)。本题就请你直接在屏幕上输出这句话。 输入格式: 本题没有输入。 输出格式: 在一行中输出…...

智能优化算法应用:基于人工蜂鸟算法无线传感器网络(WSN)覆盖优化 - 附代码
智能优化算法应用:基于人工蜂鸟算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于人工蜂鸟算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.人工蜂鸟算法4.实验参数设定5.算法结果6.参考…...

视频中自监督学习:「我的世界」下指令理解与跟随
本文介绍了北京大学人工智能研究院梁一韬助理教授所带领的 CraftJarvis 团队在「我的世界」环境下探索通用智能体设计的新进展,题为“GROOT: Learning to Follow Instructions by Watching Gameplay Videos”。 GROOT 该研究的核心目标是探索能否摆脱文本数据的标…...

Spring基于xml半注解开发
目录 Component的使用 依赖注解的使用 非自定义Bean的注解开发 Component的使用 基本Bean注解,主要是使用注解的方式替代原有的xml的<bean>标签及其标签属性的配置,使用Component注解替代<bean>标签中的id以及class属性,而对…...

功能测试,接口测试,自动化测试,压力测试,性能测试,渗透测试,安全测试,具体是干嘛的?
软件测试是一个广义的概念,他包括了多领域的测试内容,比如,很多新手可能都听说:功能测试,接口测试,自动化测试,压力测试,性能测试,渗透测试,安全测试等&#…...

oracle 下载java之前版本
登录oracle官网:Oracle | Cloud Applications and Cloud Platform 点击resource 进入该页面 点击这个 出现之前版本...

LLM之Agent(四)| AgentGPT:一个在浏览器运行的Agent
AgentGPT是一个自主人工智能Agent平台,用户只需要为Agent指定一个名称和目标,就可以在浏览器中链接大型语言模型(如GPT-4)来创建和部署Agent平台。 PS:目前agentGPT仅支持chatgpt模型,暂时不支持本地llm模…...

AGM离线下载器使用说明
AGM专用离线下载器示意图: 供电方式: 通过 USB 接口给下载器供电,跳线 JP 断开。如果客户 PCB 的 JTAG 口不能提供 3.3V 电源,或仅需烧写下载器,尚未连接用户 PCB 时,采用此种方式供电。 或者:…...

viple与物理机器人(一):线控模拟
为了检测viple程序与物理机器人是否能顺利连接上 如果能顺利连接上,那么,可以通过内建事件从而控制物理机器人的前进、后退、左转、右转以及暂停。 如果不能连接上,首先,程序无法控制物理机器人,其次,当vip…...

Appium 并行测试多个设备
一、前置说明 在自动化测试中,经常需要验证多台设备的兼容性,Appium可以用同一套测试运例并行测试多个设备,以达到验证兼容性的目的。 解决思路: 查找已连接的所有设备;为每台设备启动相应的Appium Server;…...

高防IP是什么? 防护CC 对抗DDOS
什么是DDoS高防IP? DDoS(分布式拒绝服务)攻击是指攻击者通过利用大量恶意流量向目标服务器发送请求,导致目标服务器无法正常处理合法用户的请求。DDoS高防IP是一种通过技术手段来应对DDoS攻击的解决方案。它能够过滤掉恶意流量&a…...

使用消息队列遇到的问题—kafka
目录 1 分区2 消费者3 Kafka 如何保证消息的消费顺序?3.1 方案一3.2 方案二 4 消息积压 在项目中使用kafka作为消息队列,核心工作是创建生产者—包装数据;创建消费者----包装数据。 欠缺一些思考,特此梳理项目中使用kafka遇到的一…...

Linux系统---基于Pipe实现一个简单Client-Server system
顾得泉:个人主页 个人专栏:《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂,年薪百万! 一、题目要求 Server是一个服务器进程,只能进行整数平方运算。Client要计算一个整数的平方的平方的平方,即…...

CentOS7安装最新版本git
CentOS7上的git是1.8.3.1,比较老,使用体验不好。下载源码来升级一下。 sudo yum -y install dh-autoreconf curl-devel expat-devel gettext-devel openssl-devel perl-devel zlib-devel sudo yum -y iinstall asciidoc xmlto docbook2X sudo yum -y in…...

Java项目-瑞吉外卖Day3
填充公共字段: 目的:由于某些属性,例如createdTime这些需要填充的字段会在多个地方出现,所以考虑使用公共字段自动填充的办法减少重复代码。 在对应属性上加入TableField注解。通过fill字段表明策略,是插入/更新的时候…...

Java集合框架之争:ArrayList vs LinkedList
友情提示:LinkedList其实就是数据结构中的双向链表,没学过的话可以学一下有关链表的知识,至于LinkedList中的源码其实大多数据结构的基本链表操作实现的,这里我就不多做说明了,有兴趣的话可自行看源码 由于ArrayList由…...

一个用于处理嵌入式系统中的 NAND Flash 存储器的工具 `kobs-ng`
一个用于处理嵌入式系统中的 NAND Flash 存储器的工具 kobs-ng kobs-ng 是一个用于处理嵌入式系统中的 NAND Flash 存储器的工具。它是 U-Boot(开源引导加载程序)中的一个子项目,用于擦除、写入和读取 NAND Flash 设备上的数据。 以下是 kob…...

【小白专用】MySQL查询数据库所有表名及表结构其注释
一、先了解下INFORMATION_SCHEMA 1、在MySQL中,把INFORMATION_SCHEMA看作是一个数据库,确切说是信息数据库。其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权 限等。在INF…...

数据库中常用的锁
目录 1、数据库中常用的锁类型 2、常见的数据库 3、以MySQL为例 3.1 MySQL的事务 3.2 MySQL事务的四大特性 1. 原子性(Atomicity) 2. 一致性(Consistency) 3. 隔离性(Isolation) ⭐mysql中的事务隔…...

关于对向量检索研究的一些学习资料整理
官方学习资料 主要是的学习资料是, 官方文档 和官方博客。相关文章还是挺多 挺不错的 他们更新也比较及时。有最新的东西 都会更新出来。es scdn官方博客 这里简单列一些,还有一些其他的,大家自己感兴趣去看。 什么是向量数据库 Elasticse…...