门面/外观模式

news/2024/4/29 8:29:51/文章来源:https://blog.csdn.net/qq_42402854/article/details/128139980

一、门面模式

1、定义

门面模式(Facade Pattern)又称作外观模式,是指提供一个统一的接口,用来访问子系统中的一群接口,属于结构型设计模式。

门面模式的主要特征是定义了一个高层接口,让子系统更容易使用。

2、结构

(1)模式的结构

主要角色如下:

  • 外观角色(Facade):也叫作门面角色,是系统对外的统一接口。
  • 子系统角色(SubSystem):可以同时有一个或者多个 SubSystem。每一个 SubSystem都不是一个单独的类,而是一个类的集合。

注意:子系统类中没有 Facade任何信息,即没有 Facade对象的引用。对于 SubSystem而言,Facade只是另一个客户端,处理 Facade指派的任务。

3、优缺点

优点:

  • 简化了调用过程,不用深入了解子系统。
  • 减少系统依赖,松耦合。
  • 更好的划分访问层次,提高安全性。
  • 遵循迪米特法则。

缺点:

  • 当增加子系统和画展子系统行为时,可能容易带来未知危险。
  • 不符合开闭原则。
  • 某些情况下,可能违背了单一职责原则。

4、使用场景

  • 为一个复杂的模块或者子系统提供一个简单的供外界访问的接口。
  • 希望提高子系统的相对独立性时,可以使用它。

5、在框架源码中使用

  • Spring源码中 JDBC模块下的 JdbcUtils类,它封装了与 JDBC相关的所有操作。
  • Mybatis源码中 Congiguration类,对 JDBC中关键组件的封装。

二、模式的通用实现

代码如下:

public class FacadePattern {public static void main(String[] args) {ServiceFacade serviceFacade = new ServiceFacade();serviceFacade.doCommon();}
}// 子系统角色
class SubSystemA {public void doA() {System.out.println("doing A");}
}class SubSystemB {public void doB() {System.out.println("doing B");}
}// 外观角色
class ServiceFacade {private SubSystemA subSystemA;private SubSystemB subSystemB;public ServiceFacade() {this.subSystemA = new SubSystemA();this.subSystemB = new SubSystemB();}// 对外接口public void doCommon() {subSystemA.doA();subSystemB.doB();}
}

三、模式的应用实例

以客户通过购买基金(门面)从而获得收益为例。基金经理人操作股票(子系统)交易。

(1)股票(子系统)

public class Stock1 {private String name = "股票1";public void buy(){System.out.println("买进" + name);}public void sell(){System.out.println("卖出" + name);}
}public class Stock2 {private String name = "股票2";public void buy(){System.out.println("买进" + name);}public void sell(){System.out.println("卖出" + name);}
}

(2)基金(门面)

public class FundFacade {private String name = "基金A";private Stock1 stock1;private Stock2 stock2;public FundFacade() {this.stock1 = new Stock1();this.stock2 = new Stock2();}public void buyFund(){System.out.println("买进" + name + ", 基金经理买进的股票如下:");stock1.buy();stock2.buy();}public void sellFund(){System.out.println("卖出" + name+ ", 基金经理卖出的股票如下:");stock1.sell();stock2.sell();System.out.println("收益1W+");}
}

(3)测试:小白购买该基金

	public static void main(String[] args) {FundFacade fundFacade = new FundFacade();fundFacade.buyFund();System.out.println("----第N天之后----");fundFacade.sellFund();}

在这里插入图片描述

– 求知若饥,虚心若愚。

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

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

相关文章

自然语言处理NLP——ERNIE-M:基于回译机制的“预训练-微调”多语言模型

目录 系列文章目录 一、背景介绍 1.多语言任务 1.1 多语言任务定义 1.2 多语言任务难题 2.多语言模型 2.1 多语言模型定义与原理 2.2 多语言模型困难 3.论文简介 3.1 背景与开发动机 3.2 论文梗概 3.3 论文贡献与成就 二、相关工作 1.预训练方法 1.1 预训练方法…

Tomcat的安装、在idea中的使用以及创建Web项目

目录Tomcat的安装Tomcat运行Tomcat在idea中的使用创建Web项目最后Tomcat的安装 Tomcat的官网: https://tomcat.apache.org/ 从官网上可以下载对应的版本进行使用。 下载windows64位,版本自行选择。 下载好之后找到压缩包进行解压,注意目录不要有中文且…

1. 一些截图方法的比较;2. 将截图直接转换为PDF并拼接,与插入Word后再转换为PDF的对比

1. 一些截图方法的比较 1.1. 有时候当某个软件没有导出功能,或者导出功能受限,比如 tableau public,但又需要获取展示出的可视化信息时,就需要用到截图。如果这些截图还要用在正式文档中,就需要是高清的,至…

[附源码]Python计算机毕业设计SSM篮球馆预约小程序(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

TypeScript(TS)基础内容详细介绍

目录 一、TypeScript概念 二、TypeScript特点 三、开发环境配置 四、初识ts 五、TypeScript类型声明 1、any: 2、number数字类型 3 string字符串类型 4 boolean布尔类型 表示逻辑值:true 和 false。 5 数组类型 6 元组类型 7 enum枚举类型…

Java8 函数式编程【基础篇】

Java 8是Java在保持向后兼容的前提下首次迈出重要一步,相比之前,不再是只对类库的改良,在编写复杂的集合处理、并行化执行、代码简洁度等方面都有颠覆性的提升。本文将探索和理解函数式编程的含义,以及它在Java 8中的实现。 一、…

全光谱台灯对孩子有伤害吗?儿童用台灯的好处和坏处是什么

全光谱台灯是指灯光色谱丰富度与太阳光一般全面的台灯,这样的灯光照射下的任何物体,不但颜色丰富多彩,而且极其真实,无限接近太阳光下的真实色彩,对人眼舒适度有巨大的提升,所以全光谱台灯不但对孩子无害&a…

【文件I/O】标准IO:库函数

标准IO:库函数一、基本概念1.文件类型2.标准I/O介绍3.流的概念4.文本流和二进制流5.流的缓冲类型6.标准I/O流(stdin、stdout、stderr)二、标准I/O函数1.fopen、fclose、errrno、strerror、perror(打开、关闭文件,输出错…

小程序开发音视频问题汇总及解决方案

目录 问题一:开发音视频,必用的两个小程序组件live-player和live-pusher,他们做什么用的,怎么才能使用? 问题二:一个页面只能插入一个 问题三:真机调试图片预览及视频全屏无反应 问题四&am…

在vue项目中下载swiper出现:Do not use ‘new’ for side effects报错问题

我报错的情况是:我在单文件组件vue文件中使用new Swiper,报了两个错误,图示: 第一个错误是:‘Swiper’ is not defined 第二个错误是:Do not use ‘new’ for side effects 解决办法: &#x…

5G无线技术基础自学系列 | MU-MIMO原理

素材来源:《5G无线网络规划与优化》 一边学习一边整理内容,并与大家分享,侵权即删,谢谢支持! 附上汇总贴:5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 MU-MIMO是指多个用户在上下行数据传输时…

【Linux】命令

常用命令 帮助&#xff08;Manual Pages&#xff0c;Manual&#xff1a;手册&#xff0c;特指参考文件&#xff09; man man <command_name> 打开目录&#xff08;change directory&#xff09; cd /etc/ cd /home 查看当前所在目录 pwd 创建一个名为 file 的文件&…

[附源码]计算机毕业设计JAVA校园共享单车系统

[附源码]计算机毕业设计JAVA校园共享单车系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

二、【React拓展】懒加载 lazy

文章目录1、适用点2、汇总1、适用点 懒加载往往配合路由一起使用&#xff0c;此处修改的项目是 二、【React-Router5】路由的基本使用 中的项目 首先从react中引入lazy import { lazy } from react 修改引入路由组件的写法 // import About from ./pages/About // import Home…

SequoiaDB湖仓一体分布式数据库2022.11月刊

本月看点速览 产品能力再获认可&#xff0c;入围多个榜单、报告 ‍精彩亮相2022沙丘大会湖仓一体专场 实力吸睛&#xff0c;获多家权威媒体关注与报道 生态圈不断扩大&#xff0c;与6家合作伙伴完成互认证 青杉计划2023进行中&#xff0c;一起攀登更高的“杉” 产品能力再获…

pip 安装 livetest 失败

pip 安装 livetest 失败1. 现象2. 解决方案(1) 下载(2) 移动并解压(3) 修改文件1) livetest-0.5/livetest/__init__.py2) livetest-0.5/setup.py3) livetest-0.5/test/test_select.py(4) 运行安装4. 验证1. 现象 pip 安装 livetest 失败 2. 解决方案 (1) 下载 官网下载 liv…

09-13-Hbase-shell入门操作

09-Hbase-shell入门操作&#xff1a; HBase Shell 操作 DDL基本操作 1&#xff0e;进入 HBase 客户端命令行 [roothadoop102 hbase-1.3.1]# bin/hbase shell 2&#xff0e;查看帮助命令 hbase(main):001:0> help 3&#xff0e;查看当前数据库中有哪些表 hbase(main):0…

网页添加灰色滤镜

网页添加灰色滤镜 b站的灰色滤镜 我校的灰色滤镜 CSDN的灰色滤镜 自己调制css主题,给网页加上滤镜. 更快捷的,可以在可以调制css的浏览器插件中加上滤镜,只要开启插件就会自动修改网站滤镜 以darkreader为例打开其开发者工具 *INVERT .jfk-bubble.gtx-bubble .captcheck_a…

ABAP CLEAR REFRESH FREE 说明(刘欣)

本文仔细测试总结了ABAP中的clear、refresh、free&#xff0c;因为很多时候程序的BUG就是出现在变量没有清理干净&#xff0c;希望整理一个定式出来以后少出BUG。 用clear、refresh、free对带表头的表执行的测试结果如下表&#xff1a; 看起来&#xff0c;最好的避免这些清空命…

总结:SpringBoot内嵌Tomcat原理

一、介绍 一般我们启动web服务都需要单独的去安装tomcat&#xff0c;而Springboot自身却直接整合了Tomcat&#xff0c;什么原理呢&#xff1f; 二、原理 SpringBoot应用只需要引入spring-boot-starter-web中这个依赖&#xff0c;应用程序就默认引入了tomcat依赖&#xff0c;其…