Go 语言编程模式实战
陈皓
网名“左耳朵耗子”,资深技术专家
21556 人已学习
免费领取
Go 语言编程模式实战
15
15
1.0x
00:00/00:00
登录|注册

09 | Go 编程模式:Kubernetes Visitor模式

你好,我是陈皓,网名左耳朵耗子。
这节课,我们来重点讨论一下,Kubernetes 的 kubectl 命令中的使用到的一个编程模式:Visitor(其实,kubectl 主要使用到了两个,一个是 Builder,另一个是 Visitor)。
本来,Visitor 是面向对象设计模式中一个很重要的设计模式(可以看下 Wikipedia Visitor Pattern 词条),这个模式是将算法与操作对象的结构分离的一种方法。这种分离的实际结果是能够在不修改结构的情况下向现有对象结构添加新操作,是遵循开放 / 封闭原则的一种方法。这节课,我们重点学习一下 kubelet 中是怎么使用函数式的方法来实现这个模式的。

一个简单示例

首先,我们来看一个简单设计模式的 Visitor 的示例。
我们的代码中有一个Visitor的函数定义,还有一个Shape接口,这需要使用 Visitor函数作为参数。
我们的实例的对象 CircleRectangle实现了 Shape 接口的 accept() 方法,这个方法就是等外面给我们传递一个 Visitor。
package main
import (
"encoding/json"
"encoding/xml"
"fmt"
)
type Visitor func(shape Shape)
type Shape interface {
accept(Visitor)
}
type Circle struct {
Radius int
}
func (c Circle) accept(v Visitor) {
v(c)
}
type Rectangle struct {
Width, Heigh int
}
func (r Rectangle) accept(v Visitor) {
v(r)
}
然后,我们实现两个 Visitor:一个是用来做 JSON 序列化的;另一个是用来做 XML 序列化的。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了Kubernetes中的Visitor模式,并通过一个简单的示例展示了Visitor模式的使用。文章首先介绍了一个简单的Visitor示例,然后深入讨论了Kubernetes中Visitor模式的实现方法。作者通过代码示例展示了Visitor修饰器的重构,以及如何使用Visitor模式来解耦数据和程序、使用修饰器模式、以及实现Pipeline模式。通过这些示例,读者可以了解Kubernetes中Visitor模式的实际应用,以及如何通过Visitor模式来处理复杂的数据结构。文章内容深入浅出,适合对Kubernetes编程模式感兴趣的读者阅读。

该试读文章来自《Go 语言编程模式实战》,如需阅读全部文章,
请先领取课程
免费领取
登录 后留言

全部留言(16)

  • 最新
  • 精选
  • neohope
    Demo最后的这一句: v = NewDecoratedVisitor(v, NameVisitor, OtherVisitor) 是不是应该调整为下面这个啊? v = NewDecoratedVisitor(v, NameVisitorFun, OtherThingsVisitorFun) func NameVisitorFun(info *Info03, err error) error { fmt.Printf(“==> Name=%s, NameSpace=%s\n”, info.Name, info.Namespace) return err } func OtherThingsVisitorFun(info *Info03, err error) error { fmt.Printf(“==> OtherThings=%s\n”, info.OtherThings) return err }
    2021-03-19
    3
    7
  • Camio1945
    在酷壳上还有本系列的第十篇《GO编程模式 : 泛型编程》,大家不要错过了:https://coolshell.cn/articles/21615.html
    2023-12-15归属地:湖北
    1
  • kylin
    // 装饰器模式的等价实现 LogVisitor := func(fn VisitorFunc) VisitorFunc { return func(info *Info, err error) error { fmt.Println("LogVisitor() before call function") err = fn(info, err) if err == nil { fmt.Printf("==> Name=%s, NameSpace=%s\n", info.Name, info.Namespace) } fmt.Println("LogVisitor() after call function") return err } } NameVisitor := func(fn VisitorFunc) VisitorFunc { return func(info *Info, err error) error { fmt.Println("NameVisitor() before call function") err = fn(info, err) if err == nil { fmt.Printf("==> Name=%s, NameSpace=%s\n", info.Name, info.Namespace) } fmt.Println("NameVisitor() after call function") return err } } OtherVisitor := func(fn VisitorFunc) VisitorFunc { return func(info *Info, err error) error { fmt.Println("OtherThingsVisitor() before call function") err = fn(info, err) if err == nil { fmt.Printf("==> OtherThings=%s\n", info.OtherThings) } fmt.Println("OtherThingsVisitor() after call function") return err } } var v2 Visitor v2 = NewDecoratedVisitor(&info, LogVisitor, NameVisitor, OtherVisitor) v2.Visit(loadFile)
    2022-04-02
    1
  • 天添天翼
    打卡。学完后收获良多,谢谢老师。
    2021-01-23
    1
  • 橙子888
    打卡。
    2021-01-12
    1
  • 你怎么睡得着?
    RIP
    2023-05-15归属地:内蒙古
  • 曙光
    代码1 info := Info{} var v Visitor = &info v = LogVisitor{v} v = NameVisitor{v} v = OtherThingsVisitor{v} // v的值是OtherThingsVisitor的地址,v.visitor的值NameVisitor{v} 代码2 type OtherThingsVisitor struct { visitor Visitor } 代码3 func (v OtherThingsVisitor) Visit(fn VisitorFunc) error { return v.visitor.Visit(func(info *Info, err error) error { // v.visitor.Visit是调用NameVisitor的Visit }
    2023-04-23归属地:江西
  • 一打七
    看不懂
    2022-11-13归属地:北京
  • 陈麒文
    打开
    2022-11-08归属地:福建
  • Chris
    讲的太好了,值得多看几遍
    2021-05-22
收起评论
显示
设置
留言
16
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部