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

news2024/9/24 17:09:11

文章目录

  • 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 main

import "fmt"
//创建一个子系统角色
type Deployment struct {
	Name   string
	Kind   string
	Image  string
	volume string
}

func (deployment *Deployment) Create(name string, image string, volume string) {
	deployment.Name = name
	deployment.Image = image
	deployment.Kind = "Deployment"
	deployment.volume = "pvc:" + volume
}
func (deployment *Deployment) Get() {
	fmt.Printf("%+v\n", deployment)
}
//创建第二个子系统角色
type Service struct {
	Name     string
	Kind     string
	Selector string
}

func (service *Service) Create(name string, selector string) {
	service.Name = name
	service.Kind = "Service"
	service.Selector = "deployment:" + selector
}
func (service *Service) Get() {
	fmt.Printf("%+v\n", service)
}
//创建第三个子系统角色
type PVC struct {
	Name string
	Kind string
}

func (pvc *PVC) Create(name string) {
	pvc.Name = name
	pvc.Kind = "PersistentVolumeClaim"
}
func (pvc *PVC) Get() {
	fmt.Printf("%+v\n", pvc)
}
//创建门面,它包含了所有子系统
type Project struct {
	Name       string
	Deployment Deployment
	Service    Service
	PVC        PVC
}

func (project *Project) Create(name string, image string) {
	project.Name = name
	project.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.coloradmin.cn/o/1019591.html

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

相关文章

数字孪生和元宇宙:打造未来的数字边界

数字孪生和元宇宙是近两年来被热议的两个概念,但由于技术的交叉两者也极易被混淆。本文希望带大家深入探讨一下这两者之间的关系,以及它们如何一起构建了数字时代的新格局。 1. 数字孪生的本质 数字孪生是一种虚拟模型,它通过数字手段对现实…

在微信公众号怎么实现投票活动

微信公众号实现投票活动的方法和步骤 一、投票活动的优势 通过投票活动,微信公众号可以实现用户参与、增加互动、了解用户需求等功能,同时也可以提升品牌知名度和用户粘性。以下是一些投票活动的优势: 增加用户参与度:通过投票活…

Seata四种事务模式AT、TCC、SAGA 、 XA详解

文章目录 一、 GlobalTransactional一、AT模式1、原理2 、优缺点3、实现 二、TCC模式1、原理2 、优缺点3、实现 三、SAGA模式1 、原理2 、优缺点3 、实现 四、XA模式1 、原理2 、优缺点3、 实现 五、 四种模式对比 我们知道Seata是一款开源的分布式事务解决方案,致力…

【LeetCode75】第五十八题 组合总和Ⅲ

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 题目让我们找出长度为k并且总和为n的所有组合,我们能用的元素只有1~9。 那么这种要求排列组合的题,基本是是离不…

2023客服管理者面临的挑战

客服管理者在当今的数字化时代也面临着许多挑战。以下是一些主要的挑战: 同行业竞争加剧:客服行业面临着来自同行业的竞争压力。为了获得竞争优势,企业需要不断提高自身的产品和服务质量,同时还需要不断降低成本、提高效率。然而…

go调用so库

来源:微信公众号「编程学习基地」 文章目录 go调用so库生成so库调用so库 go调用so库 生成so库 load_so.h #ifndef _LOAD_SO_H #define _LOAD_SO_Hint do_test_so_func(int a,int b);#endif load_so.c #include "load_so.h"int do_test_so_func(int …

数据结构——四叉树

四叉树(Quadtree)是一种用于表示和管理二维空间的树状数据结构。它将二维空间递归地分割成四个象限,每个象限可以继续分割,以实现对空间的更精细的划分。四叉树通常用于解决空间搜索和查询问题,例如碰撞检测、图像压缩…

vector使用和模拟实现

💓博主个人主页:不是笨小孩👀 ⏩专栏分类:数据结构与算法👀 C👀 刷题专栏👀 C语言👀 🚚代码仓库:笨小孩的代码库👀 ⏩社区:不是笨小孩👀 🌹欢迎大…

2.6W字系统总结,带你实现 Linux 自由!

以前就聊过大多数应届生入职后会遇到的两大拦路虎分别是Git和Linux,其中关于Git,前段时间已经分享过自己工作两年多以来用过的比较实用的一些命令了,这些命令可能不是最花哨的,但绝对是最实用的。 今天分享一份很全面的Linux常用…

springboot+canal+mysql+redis缓存双写一致性

canal官网地址:https://github.com/alibaba/canal/wiki/QuickStart 基本上按照官网的步骤来就行 准备 首先服务器上要安装好jdk,因为canal运行需要jdk,同时把canal对应的端口在服务中开放,否则连接不上 对于自建 MySQL , 需要先开启 Binl…

linux安装python3.x版本

linux安装python3.x版本 ① 安装依赖环境② 下载python版本包③ 安装python④ 建立软链接⑤ 加入path⑥ 验证 官网版本地址:https://www.python.org/ftp/python/ ① 安装依赖环境 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel…

Vue 使用vue-pdf 显示pdf文件 切换页面 缩放 全屏 自动播放等

<template><div id"container"><!-- 上一页、下一页--><div class"right-btn"><div click"toFullOrExit" class"turn-btn"><span>{{ isFull 1 ? "取消全屏" : "全屏" }}&l…

GLTF-pipeline

gltf-pipeline可用作命令行工具或 Node.js 模块。 开始 安装 Node.js如果还没有&#xff0c;然后&#xff1a; npm install -g gltf-pipeline使用 gltf-pipeline 作为命令行工具&#xff1a; 将 glTF 转换为 glb gltf-pipeline -i model.gltf -o model.glb gltf-pipeline…

python萌新爬虫学习笔记【建议收藏】

文章目录 1. 如何何请求解析url2. 如何获取标签里面的文本3. 如何解析JSON格式4. 如何添加常用的header5. 如何合并两个div6. 如何删除html dom的部分结构7. 如何一次性获取所有div标签里的文本8. python爬虫如何改变响应文本字符集编码9. 如何进行字符集转码11. response.text…

骨髓小游戏

欢迎来到程序小院 骨髓 玩法&#xff1a; 骨髓推塔小游戏&#xff0c;敌方士兵进入到我方高塔会毁坏建筑&#xff0c;我方可派兵前去迎战&#xff0c;我方&#xff1a;骑兵、长枪兵、弓兵、敌法&#xff1a;骷髅骑兵、骷髅长枪兵、 骷髅弓兵,快去消灭敌人吧^^。开始游戏https:…

利用爬虫技术自动化采集汽车之家的车型参数数据

导语 汽车之家是一个专业的汽车网站&#xff0c;提供了丰富的汽车信息&#xff0c;包括车型参数、图片、视频、评测、报价等。如果我们想要获取这些信息&#xff0c;我们可以通过浏览器手动访问网站&#xff0c;或者利用爬虫技术自动化采集数据。本文将介绍如何使用Python编写…

flutter开发实战-长按TextField输入框cut、copy设置为中文复制、粘贴

flutter开发实战-长按TextField输入框cut、copy设置为中文复制、粘贴 在开发过程中&#xff0c;需要长按TextField输入框cut、copy设置为中文“复制、粘贴”&#xff0c;这里记录一下设置的代码。 一、pubspec.yaml设置flutter_localizations 在pubspec.yaml中设置flutter_l…

教你制作简单的洪水淹没模型

制作思路&#xff1a; 利用GIS软件将地形图通过高程垂直夸大&#xff0c;显示出其地形地貌&#xff0c;绘制一个面&#xff0c;使面从下向上移动&#xff0c;因地形高程的不同&#xff0c;面穿过地形图的面积不同&#xff0c;从而视觉上模拟出了水淹没的过程。 前期准备&…

facechain环境部署

环境安装 # 创建虚拟环境facechain conda create -n facechain python3.8 conda activate facechain # 克隆 GIT_LFS_SKIP_SMUDGE1 git clone https://github.com/modelscope/facechain.git --depth 1 # 安装第三方库 cd facechain pip install -r requirements.txt pip insta…

【JavaEE】操作系统内核中的进程

文章目录 &#x1f490;什么叫做进程&#x1f490;进程在系统中是如何进行管理的&#x1f490;PCB中一些比较重要的属性&#x1f490;进程持有的CPU资源——进程调度&#x1f490;内存分配——内存管理 &#x1f490;什么叫做进程 进程概念&#xff1a;一个已经跑起来的程序就…