当前位置: 首页 > news >正文

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、外观模式 外观模式隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型 模式,它向现有的系统添加一个接口&#xff…...

人工智能(一)基本概念

人工智能之基本概念 常见问题什么是人工智能?人工智能应用在那些地方?人工智能的三种形态图灵测试是啥?人工智能、机器学习和深度学习之间是什么关系?为什么人工智能计算会用到GPU? 机器学习什么是机器学习&#xff1f…...

〔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&#xff1…...

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&…...

Arduino轻量URL编解码库:RFC 3986兼容的嵌入式urlencode/urldecode实现

1. 项目概述URLCode 是一个专为 Arduino 平台设计的轻量级 URL 编解码库,其核心目标是提供符合 RFC 3986 标准的application/x-www-form-urlencoded格式字符串的编码(urlencode)与解码(urldecode)能力。该库不依赖 Ard…...

产品经理、设计师必看:2026年6款AI界面生成工具实测,哪个最值得用?

过去,一款移动应用从需求文档到可交付原型,至少需要设计师投入 1~2 周时间。而今,借助 AI 界面生成工具,同样的工作可以压缩到几小时甚至几十分钟完成。目前AI界面生成工具正在重塑产品团队的工作方式。本文实测对比了 UXbot、Uiz…...

LeRobot数据采集全流程解析:从环境配置到动作回放(SO-100实战)

LeRobot数据采集全流程实战:从环境搭建到动作复现的SO-100深度指南 当我们需要让机器人学会新技能时,数据采集是构建智能系统的第一步。LeRobot作为Hugging Face推出的机器人学习平台,通过标准化流程降低了开发门槛。本文将带你完整走通SO-10…...

FanControl深度指南:智能散热系统的架构解析与实战优化

FanControl深度指南:智能散热系统的架构解析与实战优化 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/f…...

【WRF-Chem工具】grid_finn_fire_emis_v2020 工具官方用户指南解析

目录 1. 工具概述 (General Introduction)2. 针对 WRF 用户的特别说明 (SPECIAL NOTES FOR WRF)A. 输出文件与烟羽抬升 (Plume Rise)B. 变量、单位与植被类型C. 运行前提条件(非常重要)D. 时间分辨率与日变化E. WRF namelist.input 配置要求 3. fire_emi…...

避坑指南:R语言中XGBoost回归建模的5个常见错误与SHAP分析的正确姿势

避坑指南:R语言中XGBoost回归建模的5个常见错误与SHAP分析的正确姿势 在数据科学领域,XGBoost因其出色的预测性能而广受欢迎,而SHAP(Shapley Additive Explanations)则为模型解释提供了强大的数学基础。然而&#xff0…...

从风机并网振荡说起:手把手教你用Simulink设计VSG自适应阻尼,提升微网稳定性

新能源微网稳定性实战:基于Simulink的VSG自适应阻尼控制设计 当新能源发电占比超过30%时,微电网会面临一个尴尬的现状——传统同步发电机提供的旋转惯量大幅减少,系统变得像"玻璃杯"一样脆弱。去年参与某海岛微网项目时&#xff0c…...

OpenClaw技能扩展:安装Qwen3-4B专用插件实现代码生成

OpenClaw技能扩展:安装Qwen3-4B专用插件实现代码生成 1. 为什么需要Qwen3-4B专用技能 作为一个长期与代码打交道的开发者,我一直在寻找能够提升编码效率的工具。当我第一次接触OpenClaw时,最吸引我的不是它的基础自动化能力,而是…...

有些路看起来很难走,其实是在带你慢慢变强

生活里,很多人都希望自己走的是一条轻松一点、顺利一点的路。最好努力了就能有结果,付出了就能被看见,遇到的问题也都能很快解决。可真正经历过一些事情后才会发现,人生并不会总按照理想的节奏前进。很多时候,那些让人…...

高效Windows注册表分析工具实战指南:如何用RegRipper3.0突破注册表数据提取瓶颈?

高效Windows注册表分析工具实战指南:如何用RegRipper3.0突破注册表数据提取瓶颈? 【免费下载链接】RegRipper3.0 RegRipper3.0 项目地址: https://gitcode.com/gh_mirrors/re/RegRipper3.0 ▶ 核心价值:为什么RegRipper3.0是注册表分析…...