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

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()

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玄德公笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值