09 | Go 编程模式:Kubernetes Visitor模式
陈皓
你好,我是陈皓,网名左耳朵耗子。
这节课,我们来重点讨论一下,Kubernetes 的 kubectl 命令中的使用到的一个编程模式:Visitor(其实,kubectl 主要使用到了两个,一个是 Builder,另一个是 Visitor)。
本来,Visitor 是面向对象设计模式中一个很重要的设计模式(可以看下 Wikipedia Visitor Pattern 词条),这个模式是将算法与操作对象的结构分离的一种方法。这种分离的实际结果是能够在不修改结构的情况下向现有对象结构添加新操作,是遵循开放 / 封闭原则的一种方法。这节课,我们重点学习一下 kubelet 中是怎么使用函数式的方法来实现这个模式的。
一个简单示例
首先,我们来看一个简单设计模式的 Visitor 的示例。
我们的代码中有一个Visitor的函数定义,还有一个Shape接口,这需要使用 Visitor函数作为参数。
我们的实例的对象 Circle和 Rectangle实现了 Shape 接口的 accept() 方法,这个方法就是等外面给我们传递一个 Visitor。
然后,我们实现两个 Visitor:一个是用来做 JSON 序列化的;另一个是用来做 XML 序列化的。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了Kubernetes中的Visitor模式,并通过一个简单的示例展示了Visitor模式的使用。文章首先介绍了一个简单的Visitor示例,然后深入讨论了Kubernetes中Visitor模式的实现方法。作者通过代码示例展示了Visitor修饰器的重构,以及如何使用Visitor模式来解耦数据和程序、使用修饰器模式、以及实现Pipeline模式。通过这些示例,读者可以了解Kubernetes中Visitor模式的实际应用,以及如何通过Visitor模式来处理复杂的数据结构。文章内容深入浅出,适合对Kubernetes编程模式感兴趣的读者阅读。
该试读文章来自《Go 语言编程模式实战》,如需阅读全部文章,
请先领取课程
请先领取课程
免费领取
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(16)
- 最新
- 精选
- neohopeDemo最后的这一句: 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-1937
- Camio1945在酷壳上还有本系列的第十篇《GO编程模式 : 泛型编程》,大家不要错过了:https://coolshell.cn/articles/21615.html2023-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-021
- 天添天翼打卡。学完后收获良多,谢谢老师。2021-01-231
- 橙子888打卡。2021-01-121
- 你怎么睡得着?RIP2023-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
收起评论