《golang设计模式》第二部分·结构型模式-05-门面模式Facade)

文章目录

  • 1. 概述
    • 1.1 角色
    • 1.2 类图
  • 2. 代码示例
    • 2.1 设计
    • 2.2 代码
    • 2.2 类图

1. 概述

门面(Facade)向客户端提供使用子系统的统一接口,用于简化客户端使用子系统的操作。

1.1 角色

  • 门面角色(Facade)
    • 客户端可以调用的接口或方法
    • 此角色知晓系统的所有功能和责任
    • 一般情况下,该角色没有实际业务逻辑,只是一个委托类。
  • 子系统角色(Subsystem)
    • 同时有一个或多个子系统
    • 子系统并不知道门面的存在(对于子系统,门面是一个客户端)

1.2 类图

Client
Facade
SubsystemA
-Service()
SubsystemB
-Service()
SubsystemC
-Service()

2. 代码示例

2.1 设计

  • 分别创建DeploymentServicePVC三个类
    • 它们的Create()方法给它本身赋值
    • 它们的Get()方法可以查询它本身
  • 创建统一门面Project()
    • 它关联了DeploymentServicePVC三个类
    • 它的Create()方法调用DeploymentServicePVCCreate()方法创建它和所有子系统
    • 它的Get()方法调用DeploymentServicePVCCet()方法查询它和所有子系统
  • 调用
    • 实例化一个门面project
    • 用它的Create()方法统一创建所有子系统
    • 查询结果

2.2 代码

package mainimport "fmt"
//创建一个子系统角色
type Deployment struct {Name   stringKind   stringImage  stringvolume string
}func (deployment *Deployment) Create(name string, image string, volume string) {deployment.Name = namedeployment.Image = imagedeployment.Kind = "Deployment"deployment.volume = "pvc:" + volume
}
func (deployment *Deployment) Get() {fmt.Printf("%+v\n", deployment)
}
//创建第二个子系统角色
type Service struct {Name     stringKind     stringSelector string
}func (service *Service) Create(name string, selector string) {service.Name = nameservice.Kind = "Service"service.Selector = "deployment:" + selector
}
func (service *Service) Get() {fmt.Printf("%+v\n", service)
}
//创建第三个子系统角色
type PVC struct {Name stringKind string
}func (pvc *PVC) Create(name string) {pvc.Name = namepvc.Kind = "PersistentVolumeClaim"
}
func (pvc *PVC) Get() {fmt.Printf("%+v\n", pvc)
}
//创建门面,它包含了所有子系统
type Project struct {Name       stringDeployment DeploymentService    ServicePVC        PVC
}func (project *Project) Create(name string, image string) {project.Name = nameproject.PVC.Create("pvc_" + name)project.Deployment.Create(name, image, project.PVC.Name)project.Service.Create(name, project.Deployment.Name)
}
func (project *Project) Get() {fmt.Println(project.Name)project.Deployment.Get()project.Service.Get()project.PVC.Get()
}func main() {project := &Project{}project.Create("nginx", "nginx:1.21")project.Get()
}
  • 输出
nginx
&{Name:nginx Kind:Deployment Image:nginx:1.21 volume:pvc:pvc_nginx}
&{Name:nginx Kind:Service Selector:deployment:nginx}               
&{Name:pvc_nginx Kind:PersistentVolumeClaim}

2.2 类图

Client
Project
+Name:string
+Create()
+Get()
Deployment
+Name:string
+Kind:string
+Image:string
+volume:string
+Create()
+Get()
Service
+Name:string
+Kind:string
+Selector:string
+Create()
+Get()
PVC
+Name:string
+Kind:string
+Create()
+Get()

在这里插入图片描述

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

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

相关文章

svg图片代码data:image/svg+xml转png图片方法

把代码保存为html格式的文件中,用浏览器访问,即可右键保存 从AI软件或其它网站得到svg图片代码后,把他复制到下面源码上 注意:src""图片地址中,一些参数的含义 d‘这里是图片代码数据’ viewBox是图片显示区域,宽,高等 fill%23000000’这里表示颜色 ,后面6位0表示黑色…

Vercel.json配置路由重定向(重写)【vue项目】

在项目根目录创建vercel.json {"rewrites": [{"source": "/(.*)","destination": "/"}] } vue-router 路由模式改为 history(vue2版本) createWebHistory(vue3版本)

7、DVWA——SQL盲注

文章目录 一、概述二、low2.1 通关思路(布尔盲注)(1)判断是否存在SQL注入漏洞(2)判断属于数字型注入还是字符型注入(3)判断结果集中的字段数(4)猜数据库名长度…

ArcGIS Pro将SHP文件转CAD并保留图层名称

相信大家应该都使用过ArcGIS将SHP文件转CAD格式,转换过后所有的要素都在一个图层内,那么有没有办法将SHP文件某个字段的值作为CAD的图层名字呢,答案是肯定的,这里就为大家介绍一下ArcGIS Pro转CAD文件并且保留图层名称的方法&…

Windows编程dll基本知识点

前言 本篇博客主要是记录windows系统下dll开发的相关基本知识点,并使用相关分析工具分析,有利于初学者学习,更是为开发者查缺补漏; 使用dumpbin查看dll,lib,exe相关信息 VS编译器提供了查看链接库相关的工具,安装后…

【c++GDAL】IHS融合

【c&GDAL】IHS融合 基于IHS变换融合,实现多光谱和全色影像之间的融合。IHS分别指亮度(I)、色度(H)、饱和度(S)。IHS变换融合基于亮度I进行变换,色度和饱和度空间保持不变。 IHS融合步骤: (1)将多光谱RGB影像变换到…

网络安全:保护你的系统

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

FLASK中的鉴权的插件Flask-HTTPAuth

在 Web 应用中,我们经常需要保护我们的 api,以避免非法访问。比如,只允许登录成功的用户发表评论等。Flask-HTTPAuth 扩展可以很好地对 HTTP 的请求进行认证,不依赖于 Cookie 和 Session。本文主要介绍两种认证的方式:…

地牢大师问题(bfs提高训练 + 免去边界处理的特殊方法)

地牢大师问题 文章目录 地牢大师问题前言题目描述题目分析输入处理移动方式【和二维的对比】边界判断问题的解决 代码总结 前言 在之前的博客里面,我们介绍了bfs 基础算法的模版和应用,这里我们再挑战一下自己,尝试一个更高水平的题目,加深一…

点云从入门到精通技术详解100篇-基于点云语义分割的电力线提取及聚类研究(下)

目录 3.4.3 MSIDA-Net 与主成分分析法对比 基于簇最低点聚类算法的电力线聚类及重建

Docker部署单点Elasticsearch与Kibana

一 、 创建网络 因为需要部署kibana容器,因此需要让es和kibana容器互联。这里创建一个网络: docker network create es-net # 创建一个网络名称为:es-net 二 、拉取并加载镜像 方式一 docker pull elasticsearch:7.12.1 版本为elasticsearch的7…

列属性与数据完整性

1.2 数据类型——值类型 1.2.1 整型 类型字节范围tinyint1-128~127smallint2-32768~32767mediumint3-8388608~8388607int4-231~231-1bigint8-263~263-1 1、无符号整数(unsigned):无符号数没有负数,正数部分是有符号的两倍。 例…

Linux驱动之INPUT子系统框架

目录 一、input 子系统简介 二、input 驱动编写流程 1、注册 input_dev 2、上报输入事件 三、input_event 结构体 按键、鼠标、键盘、触摸屏等都属于输入(input)设备, Linux 内核为此专门做了一个叫做 input子系统的框架来处理输入事件。输入设备本质上还是字符设…

Go语言开发环境搭建指南:快速上手构建高效的Go开发环境

Go 官网:https://go.dev/dl/ Go 语言中文网:https://studygolang.com/dl 下载 Go 的语言包 进入官方网站 Go 官网 或 Go 语言中文网: 选择下载对应操作系统的安装包: 等待下载完成: 安装 Go 的语言包 双击运行上…

udp的简单整理

最近思考udp处理的一些细节,根据公开课,反复思考,终于有所理解,做整理备用。 0:简单汇总 1:udp是基于报文传输的,接收方收取数据时要一次性读完。 2:借助udp进行发包,…

51单片机 串口通信

UART.h #ifndef __UART_H__ #define __UART_H__void UART_Init(); void UART_SendByte(unsigned char Byte);#endifUART.H #include <REGX52.H>/*** brief 串口初始化&#xff0c;4800bps12.000MHz* param 无* retval 无*/ void UART_Init() {SCON0x40;PCON | 0x80;T…

C++数据结构 -- 哈希表

目录 一、哈希概念二、 哈希冲突三、 哈希函数四、 减少哈希冲突常用的方法4.1 闭散列4.1.1 闭散列的开放定址法的增容4.1.2 闭散列的开放定址法的哈希结构的实现 4.3 开散列4.3.1 开散列概念4.3.2 插入元素4.3.2 删除元素4.3.3 开散列的哈希桶的增容4.3.4 开散列的哈希桶(拉链…

CentOS7下yum安装php7

1.安装epel-release EPEL&#xff08;Extra Packages for Enterprise Linux&#xff09;存储库提供了标准 Red Hat 和 CentOS 存储库中未包含的其他软件包。EPEL 存储库的创建是因为 Fedora 贡献者希望使用他们在 Red Hat Enterprise Linux&#xff08;RHEL&#xff09;及其衍…

快速搭建SpringBoot3.x项目

快速搭建SpringBoot3.x项目 写在前面一、创建项目二、配置多环境三、连接数据库查询数据3.1 新建数据库mybatisdemo并且创建sys_user表3.2 创建实体类3.2 创建Mapper接口3.3 添加mybatis.xml文件3.4 新建service 接口及实现类3.5 创建Controller 四、封装统一结果返回4.1 定义 …

Attention is all you need 论文笔记

该论文引入Transformer&#xff0c;主要核心是自注意力机制&#xff0c;自注意力&#xff08;Self-Attention&#xff09;机制是一种可以考虑输入序列中所有位置信息的机制。 RNN介绍 引入RNN为了更好的处理序列信息&#xff0c;比如我 吃 苹果&#xff0c;前后的输入之间是有…