1. 概述
門面(Facade)向客戶端提供使用子系統(tǒng)的統(tǒng)一接口,用于簡(jiǎn)化客戶端使用子系統(tǒng)的操作。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-733259.html
1.1 角色
- 門面角色(Facade)
- 客戶端可以調(diào)用的接口或方法
- 此角色知曉系統(tǒng)的所有功能和責(zé)任
- 一般情況下,該角色沒(méi)有實(shí)際業(yè)務(wù)邏輯,只是一個(gè)委托類。
- 子系統(tǒng)角色(Subsystem)
- 同時(shí)有一個(gè)或多個(gè)子系統(tǒng)
- 子系統(tǒng)并不知道門面的存在(對(duì)于子系統(tǒng),門面是一個(gè)客戶端)
1.2 類圖
2. 代碼示例
2.1 設(shè)計(jì)
- 分別創(chuàng)建
Deployment
、Service
、PVC
三個(gè)類- 它們的
Create()
方法給它本身賦值 - 它們的
Get()
方法可以查詢它本身
- 它們的
- 創(chuàng)建統(tǒng)一門面
Project()
- 它關(guān)聯(lián)了
Deployment
、Service
、PVC
三個(gè)類 - 它的Create()方法調(diào)用
Deployment
、Service
、PVC
的Create()
方法創(chuàng)建它和所有子系統(tǒng) - 它的
Get()
方法調(diào)用Deployment
、Service
、PVC
的Cet()
方法查詢它和所有子系統(tǒng)
- 它關(guān)聯(lián)了
- 調(diào)用
- 實(shí)例化一個(gè)門面
project
- 用它的
Create()
方法統(tǒng)一創(chuàng)建所有子系統(tǒng) - 查詢結(jié)果
- 實(shí)例化一個(gè)門面
2.2 代碼
package main
import "fmt"
//創(chuàng)建一個(gè)子系統(tǒng)角色
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)
}
//創(chuàng)建第二個(gè)子系統(tǒng)角色
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)
}
//創(chuàng)建第三個(gè)子系統(tǒng)角色
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)
}
//創(chuàng)建門面,它包含了所有子系統(tǒng)
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 類圖
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-733259.html
到了這里,關(guān)于《golang設(shè)計(jì)模式》第二部分·結(jié)構(gòu)型模式-05-門面模式Facade)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!