Go和Java实现外观模式
Go和Java实现外观模式
下面我们通过一个构造各种形状的案例来说明外观模式的使用。
1、外观模式
外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型
模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。
这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。
-
意图:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统
更加容易使用。
-
主要解决:降低访问复杂系统的内部子系统时的复杂度,简化客户端之间的接口。
-
何时使用:1、客户端不需要知道系统内部的复杂联系,整个系统只需提供一个"接待员"即可。 2、定义系统
的入口。
-
如何解决:客户端不与系统耦合,外观类与系统耦合。
-
关键代码:在客户端和复杂系统之间再加一层,这一层将调用顺序、依赖关系等处理好。
-
应用实例:1、去医院看病,可能要去挂号、门诊、划价、取药,让患者或患者家属觉得很复杂,如果有提供
接待人员,只让接待人员来处理,就很方便。 2、JAVA 的三层开发模式。
-
优点:1、减少系统相互依赖。 2、提高灵活性。 3、提高了安全性。
-
缺点:不符合开闭原则,如果要改东西很麻烦,继承重写都不合适。
-
使用场景:1、为复杂的模块或子系统提供外界访问的模块。 2、子系统相对独立。 3、预防低水平人员带来
的风险。
-
注意事项:在层次化结构中,可以使用外观模式定义系统中每一层的入口。
-
适用性:
当你要为一个复杂子系统提供一个简单接口时,子系统往往因为不断演化而变得越来越复杂。大多数模式使用
时都会产生更多更小的类,这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定
制子系统的用户带来一些使用上的困难。Facade 可以提供一个简单的缺省视图,这一视图对大多数用户来说
已经足够,而那些需要更多的可定制性的用户可以越过 facade 层。
客户程序与抽象类的实现部分之间存在着很大的依赖性,引入 facade 将这个子系统与客户以及其他的子系统
分离,可以提高子系统的独立性和可移植性。
当你需要构建一个层次结构的子系统时,使用 facade 模式定义子系统中每层的入口点,如果子系统之间是相
互依赖的,你可以让它们仅通过 facade 进行通讯,从而简化了它们之间的依赖关系。
2、Go实现外观模式
package facade// ========== Shape ==========
type Shape interface {draw()
}
package facadeimport "fmt"// ========== Circle ==========
type Circle struct {
}func (circle *Circle) draw() {fmt.Println("Circle::draw()")
}
package facadeimport "fmt"// ========== Rectangle ==========
type Rectangle struct {
}func (rectangle *Rectangle) draw() {fmt.Println("Rectangle::draw()")
}
package facadeimport "fmt"// ========== Square ==========
type Square struct {
}func (Square *Square) draw() {fmt.Println("Square::draw()")
}
package facade// ========== ShapeFacade ==========
type ShapeFacade struct {circle Circlerectangle Rectanglesquare Square
}func NewShapeFacade() ShapeFacade {return ShapeFacade{circle: Circle{},rectangle: Rectangle{},square: Square{},}
}func (shapeFacade *ShapeFacade) DrawCircle() {shapeFacade.circle.draw()
}func (shapeFacade *ShapeFacade) DrawRectangle() {shapeFacade.rectangle.draw()
}func (shapeFacade *ShapeFacade) DrawSquare() {shapeFacade.square.draw()
}
# 输出
Circle::draw()
Rectangle::draw()
Square::draw()
3、Java实现外观模式
package facade;// ========== Shape ==========
public interface Shape {void draw();
}
package facade;// ========== Rectangle ==========
public class Rectangle implements Shape{@Overridepublic void draw() {System.out.println("Rectangle::draw()");}
}
package facade;// ========== Circle ==========
public class Circle implements Shape{@Overridepublic void draw() {System.out.println("Circle::draw()");}
}
package facade;// ========== Square ==========
public class Square implements Shape{@Overridepublic void draw() {System.out.println("Square::draw()");}
}
package facade;// ========== ShapeFacade ==========
public class ShapeFacade {private Shape circle;private Shape rectangle;private Shape square;public ShapeFacade() {circle = new Circle();rectangle = new Rectangle();square = new Square();}public void drawCircle(){circle.draw();}public void drawRectangle(){rectangle.draw();}public void drawSquare(){square.draw();}
}
package facade;public class Test {public static void main(String[] args) {ShapeFacade shapeFacade = new ShapeFacade();shapeFacade.drawCircle();shapeFacade.drawRectangle();shapeFacade.drawSquare();}
}
# 输出
Circle::draw()
Rectangle::draw()
Square::draw()
相关文章:
Go和Java实现外观模式
Go和Java实现外观模式 下面我们通过一个构造各种形状的案例来说明外观模式的使用。 1、外观模式 外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型 模式,它向现有的系统添加一个接口ÿ…...
人工智能(一)基本概念
人工智能之基本概念 常见问题什么是人工智能?人工智能应用在那些地方?人工智能的三种形态图灵测试是啥?人工智能、机器学习和深度学习之间是什么关系?为什么人工智能计算会用到GPU? 机器学习什么是机器学习?…...
〔AI 绘画〕Stable Diffusion 之 解决绘制多人或面部很小的人物时面部崩坏问题 篇
✨ 目录 🎈 脸部崩坏🎈 下载脸部修复插件🎈 启用脸部修复插件🎈 插件生成效果🎈 插件功能详解 🎈 脸部崩坏 相信很多人在画图时候,特别是画 有多个人物 图片或者 人物在图片中很小 的时候&…...
初步认识OSI/TCP/IP一(第三十八课)
1 初始OSI模型 OSI参考模型(Open Systems Interconnection Reference Model)是一个由国际标准化组织(ISO)和国际电报电话咨询委员会(CCITT)联合制定的网络通信协议规范,它将网络通信分为七个不同的层次,每个层次负责不同的功能和任务。 2 网络功能 数据通信、资源共享…...
英伟达结构化剪枝工具Nvidia Apex Automatic Sparsity [ASP](2)——代码分析
伟达结构化剪枝工具Nvidia Apex Automatic Sparsity [ASP](2)——代码分析 ASP整个模块的结果如下: . ├── COPYRIGHT ├── README.md ├── __init__.py ├── asp.py ├── permutation_lib.py ├── permutation_search_kernels…...
FileNotFoundError: [WinError 2] 系统找不到指定的文件。
pyspark demo程序创建spark上下文 完整报错如下: sc SparkContext(“local”, “Partition ID Example”) File “C:\ProgramData\anaconda3\envs\python36\lib\site-packages\pyspark\context.py”, line 133, in init SparkContext._ensure_initialized(self, ga…...
Linux: sysctl:net: IPV4_DEVCONF_ALL ignore_routes_with_linkdown; all vs default
文章目录 简介实例 ignore_routes_with_linkdownlinkdown 的引入dead的引入简介 一般下边这种类型的配置都有三种类型选项:all,default,specific net.ipv6.conf.acc.ignore_routes_with_linkdown = 0 net.ipv6.conf.all.ignore_routes_with_linkdown = 0 net.ipv6.conf.def…...
光耦继电器:实现电气隔离的卓越选择
光耦继电器是一种常用的电子元件,用于实现电气隔离和信号传输。在工业控制、自动化系统和电力电子等领域,光耦继电器具有独特的特点和优势。本文将从可靠性、隔离性、响应速度和适应性等方面对光耦继电器的特点进行概述。 光耦继电器是一种典型的固态继电…...
鸿蒙开发学习笔记2——实现页面之间跳转
鸿蒙开发学习笔记2——实现页面之间跳转 问题背景 上篇文章中,介绍了鸿蒙开发如何新建一个项目跑通hello world,本文将介绍在新建的项目中实现页面跳转的功能。 问题分析 ArkTS工程目录结构(FA模型) 各目录和路径的介绍如下…...
电子商务类网站需要什么配置的服务器?
随着电子商务的迅猛发展,越来越多的企业和创业者选择在互联网上开设自己的电商网站。为了确保电商网站能够高效运行,给用户提供良好的体验,选择合适的服务器配置至关重要。今天飞飞将和你分享电子商务类网站所需的服务器配置,希望…...
table 根据窗口缩放,自适应
element-plus中,直接应用在页面样式上, ::v-deep .el-table{width: 100%; } ::v-deep .el-table__header-wrapper table,::v-deep .el-table__body-wrapper table{width: 100% !important; } ::v-deep .el-table__body,::v-deep .el-table__footer,::v-d…...
应急响应-Webshell
文章目录 一、Webshell概述什么是WebshellWebshell分类基于编程语言基于文件大小/提供的功能多少 Webshell 检测方法 二、常规处置方法三、技术指南1、初步预判2、 Webshell排查3、Web日志分析(查找攻击路径及失陷原因)4、系统排查4.1 Windows4.2 Linux …...
【调整奇数偶数顺序】
调整奇数偶数顺序 1.题目 输入一个整数数组,实现一个函数, 来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分, 所有偶数位于数组的后半部分。 2.题目分析 这道题首先用到的方法是冒泡排序的思想,首先通过冒泡排序…...
Linux(Ubuntu)系统临时IP以及静态IP配置(关闭、启动网卡等操作)
1 Ubuntu临时IP设置2 Ubuntu静态IP设置3 多个网卡IP设置4 关闭、启动网卡前提是Linux下的网络桥接不能用,不能通过识别网卡来添加IP地址,只能通过静态写死的方式去设置IP 对于CentOS版本下的静态IP的配置可以参考这篇 Linux系统静态IP配置(CentOS) 1 Ubuntu临时IP设置 Li…...
2023-08-11 LeetCode每日一题(矩阵对角线元素的和)
2023-08-11每日一题 一、题目编号 1572. 矩阵对角线元素的和二、题目链接 点击跳转到题目位置 三、题目描述 给你一个正方形矩阵 mat,请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1࿱…...
Github 80 个键盘快捷键和一些搜索技巧的备忘清单
文章目录 键盘快捷键站点范围的快捷方式资料库源代码编辑源码浏览注释问题和拉取请求列表问题和拉取请求拉取请求的变化项目板通知网络图 搜索技巧范围搜索文件路径完全符合布尔运算符基于仓库的条件基于 issue 的条件基于用户的条件 参考网址 键盘快捷键 站点范围的快捷方式 …...
神经网络基础-神经网络补充概念-08-逻辑回归中的梯度下降算法
概念 逻辑回归是一种用于分类问题的机器学习算法,而梯度下降是优化算法,用于更新模型参数以最小化损失函数。在逻辑回归中,我们使用梯度下降算法来找到最优的模型参数,使得逻辑回归模型能够更好地拟合训练数据。 逻辑回归中的梯…...
npm ERR! cb.apply is not a function
当NPM版本过低导致 npm ERR! cb.apply is not a function 1. win r 打开运行,输入%appdata% 2. 删除 npm 和 npm-cache 文件夹 3. 执行npm cache clean --force命令 如果还不行,就执行卸载Node.js重新安装。...
iShot Pro for Mac 2.3.9最新中文版
iShot Pro是一款非常优秀的Mac截图软件,软件非常易于操作,主页面还设置了学习教程,可以轻松玩转软件所有功能,并且功能非常强大,不仅可以实现多种截图方式,还可以进行标注、贴图、取色、录屏、录音、OCR识别…...
FiboSearch Pro – Ajax Search for WooCommerce 商城AJAX实时搜索插件
FiboSearch Pro是最受欢迎的WooCommerce 产品搜索插件。它为您的用户提供精心设计的高级 AJAX 搜索栏,并提供实时搜索建议。默认情况下,WooCommerce 提供非常简单的搜索解决方案,没有实时产品搜索,甚至没有 SKU 搜索。FiboSearch&…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
Android写一个捕获全局异常的工具类
项目开发和实际运行过程中难免会遇到异常发生,系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler,它是Thread的子类(就是package java.lang;里线程的Thread)。本文将利用它将设备信息、报错信息以及错误的发生时间都…...
Spring AOP代理对象生成原理
代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】,这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...
PH热榜 | 2025-06-08
1. Thiings 标语:一套超过1900个免费AI生成的3D图标集合 介绍:Thiings是一个不断扩展的免费AI生成3D图标库,目前已有超过1900个图标。你可以按照主题浏览,生成自己的图标,或者下载整个图标集。所有图标都可以在个人或…...
数据库正常,但后端收不到数据原因及解决
从代码和日志来看,后端SQL查询确实返回了数据,但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离,并且ai辅助开发的时候,很容易出现前后端变量名不一致情况,还不报错,只是单…...
前端打包工具简单介绍
前端打包工具简单介绍 一、Webpack 架构与插件机制 1. Webpack 架构核心组成 Entry(入口) 指定应用的起点文件,比如 src/index.js。 Module(模块) Webpack 把项目当作模块图,模块可以是 JS、CSS、图片等…...
