当前位置:首页 > 编程笔记 > 正文
已解决

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

来自网友在路上 165865提问 提问时间:2023-09-21 16:23:20阅读次数: 65

最佳答案 问答题库658位专家为你答疑解惑

文章目录

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

1. 概述

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

1.1 角色

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

1.2 类图

<style>#mermaid-svg-NKRINGFtSZ0d9w28 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-NKRINGFtSZ0d9w28 .error-icon{fill:#552222;}#mermaid-svg-NKRINGFtSZ0d9w28 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-NKRINGFtSZ0d9w28 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-NKRINGFtSZ0d9w28 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-NKRINGFtSZ0d9w28 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-NKRINGFtSZ0d9w28 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-NKRINGFtSZ0d9w28 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-NKRINGFtSZ0d9w28 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-NKRINGFtSZ0d9w28 .marker.cross{stroke:#333333;}#mermaid-svg-NKRINGFtSZ0d9w28 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-NKRINGFtSZ0d9w28 g.classGroup text{fill:#9370DB;fill:#131300;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-NKRINGFtSZ0d9w28 g.classGroup text .title{font-weight:bolder;}#mermaid-svg-NKRINGFtSZ0d9w28 .nodeLabel,#mermaid-svg-NKRINGFtSZ0d9w28 .edgeLabel{color:#131300;}#mermaid-svg-NKRINGFtSZ0d9w28 .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-NKRINGFtSZ0d9w28 .label text{fill:#131300;}#mermaid-svg-NKRINGFtSZ0d9w28 .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-NKRINGFtSZ0d9w28 .classTitle{font-weight:bolder;}#mermaid-svg-NKRINGFtSZ0d9w28 .node rect,#mermaid-svg-NKRINGFtSZ0d9w28 .node circle,#mermaid-svg-NKRINGFtSZ0d9w28 .node ellipse,#mermaid-svg-NKRINGFtSZ0d9w28 .node polygon,#mermaid-svg-NKRINGFtSZ0d9w28 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-NKRINGFtSZ0d9w28 .divider{stroke:#9370DB;stroke:1;}#mermaid-svg-NKRINGFtSZ0d9w28 g.clickable{cursor:pointer;}#mermaid-svg-NKRINGFtSZ0d9w28 g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-NKRINGFtSZ0d9w28 g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-NKRINGFtSZ0d9w28 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-NKRINGFtSZ0d9w28 .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-NKRINGFtSZ0d9w28 .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-NKRINGFtSZ0d9w28 .dashed-line{stroke-dasharray:3;}#mermaid-svg-NKRINGFtSZ0d9w28 #compositionStart,#mermaid-svg-NKRINGFtSZ0d9w28 .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-NKRINGFtSZ0d9w28 #compositionEnd,#mermaid-svg-NKRINGFtSZ0d9w28 .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-NKRINGFtSZ0d9w28 #dependencyStart,#mermaid-svg-NKRINGFtSZ0d9w28 .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-NKRINGFtSZ0d9w28 #dependencyStart,#mermaid-svg-NKRINGFtSZ0d9w28 .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-NKRINGFtSZ0d9w28 #extensionStart,#mermaid-svg-NKRINGFtSZ0d9w28 .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-NKRINGFtSZ0d9w28 #extensionEnd,#mermaid-svg-NKRINGFtSZ0d9w28 .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-NKRINGFtSZ0d9w28 #aggregationStart,#mermaid-svg-NKRINGFtSZ0d9w28 .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-NKRINGFtSZ0d9w28 #aggregationEnd,#mermaid-svg-NKRINGFtSZ0d9w28 .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-NKRINGFtSZ0d9w28 .edgeTerminals{font-size:11px;}#mermaid-svg-NKRINGFtSZ0d9w28 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}</style>
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 类图

<style>#mermaid-svg-sKO4i9dOloER5OH3 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-sKO4i9dOloER5OH3 .error-icon{fill:#552222;}#mermaid-svg-sKO4i9dOloER5OH3 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-sKO4i9dOloER5OH3 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-sKO4i9dOloER5OH3 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-sKO4i9dOloER5OH3 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-sKO4i9dOloER5OH3 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-sKO4i9dOloER5OH3 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-sKO4i9dOloER5OH3 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-sKO4i9dOloER5OH3 .marker.cross{stroke:#333333;}#mermaid-svg-sKO4i9dOloER5OH3 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-sKO4i9dOloER5OH3 g.classGroup text{fill:#9370DB;fill:#131300;stroke:none;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-sKO4i9dOloER5OH3 g.classGroup text .title{font-weight:bolder;}#mermaid-svg-sKO4i9dOloER5OH3 .nodeLabel,#mermaid-svg-sKO4i9dOloER5OH3 .edgeLabel{color:#131300;}#mermaid-svg-sKO4i9dOloER5OH3 .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-sKO4i9dOloER5OH3 .label text{fill:#131300;}#mermaid-svg-sKO4i9dOloER5OH3 .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-sKO4i9dOloER5OH3 .classTitle{font-weight:bolder;}#mermaid-svg-sKO4i9dOloER5OH3 .node rect,#mermaid-svg-sKO4i9dOloER5OH3 .node circle,#mermaid-svg-sKO4i9dOloER5OH3 .node ellipse,#mermaid-svg-sKO4i9dOloER5OH3 .node polygon,#mermaid-svg-sKO4i9dOloER5OH3 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-sKO4i9dOloER5OH3 .divider{stroke:#9370DB;stroke:1;}#mermaid-svg-sKO4i9dOloER5OH3 g.clickable{cursor:pointer;}#mermaid-svg-sKO4i9dOloER5OH3 g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-sKO4i9dOloER5OH3 g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-sKO4i9dOloER5OH3 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-sKO4i9dOloER5OH3 .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-sKO4i9dOloER5OH3 .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-sKO4i9dOloER5OH3 .dashed-line{stroke-dasharray:3;}#mermaid-svg-sKO4i9dOloER5OH3 #compositionStart,#mermaid-svg-sKO4i9dOloER5OH3 .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-sKO4i9dOloER5OH3 #compositionEnd,#mermaid-svg-sKO4i9dOloER5OH3 .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-sKO4i9dOloER5OH3 #dependencyStart,#mermaid-svg-sKO4i9dOloER5OH3 .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-sKO4i9dOloER5OH3 #dependencyStart,#mermaid-svg-sKO4i9dOloER5OH3 .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-sKO4i9dOloER5OH3 #extensionStart,#mermaid-svg-sKO4i9dOloER5OH3 .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-sKO4i9dOloER5OH3 #extensionEnd,#mermaid-svg-sKO4i9dOloER5OH3 .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-sKO4i9dOloER5OH3 #aggregationStart,#mermaid-svg-sKO4i9dOloER5OH3 .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-sKO4i9dOloER5OH3 #aggregationEnd,#mermaid-svg-sKO4i9dOloER5OH3 .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-sKO4i9dOloER5OH3 .edgeTerminals{font-size:11px;}#mermaid-svg-sKO4i9dOloER5OH3 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}</style>
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()

在这里插入图片描述

查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"《golang设计模式》第二部分·结构型模式-05-门面模式Facade)":http://eshow365.cn/6-10820-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!