左耳听风
陈皓
网名“左耳朵耗子”,资深技术专家
180940 人已学习
新⼈⾸单¥98
登录后,你可以任选6讲全文学习
课程目录
已完结/共 119 讲
左耳听风
15
15
1.0x
00:00/00:00
登录|注册

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

Visitor修饰器
使用方代码
Log Visitor
Other Visitor
Name Visitor
Visitor模式定义
kubectl命令及其工作原理
Kubernetes的数据模型
Visitor模式示例
Visitor模式
kubectl的实现方法
Kubernetes相关背景
简介
Go 编程模式:Kubernetes Visitor模式

该思维导图由 AI 生成,仅供参考

你好,我是陈皓,网名左耳朵耗子。
这节课,我们来重点讨论一下,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模式是一种编程模式,本文通过讨论`kubectl`命令中的使用到的Visitor模式,重点学习了`kubelet`中如何使用函数式的方法来实现这个模式。文章首先介绍了一个简单的Visitor示例,然后深入探讨了`kubectl`的实现方法,包括Visitor模式的定义、不同类型的Visitor以及Visitor修饰器的重构。通过示例代码展示了Visitor模式的应用,解耦了数据和程序,使用了修饰器模式,并做出了Pipeline的模式。读者可以通过本文了解Visitor模式的基本概念和在Kubernetes中的实际应用,以及如何通过Visitor模式来解耦数据和程序,实现代码的重构和简化。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《左耳听风》
新⼈⾸单¥98
立即购买
登录 后留言

全部留言(4)

  • 最新
  • 精选
  • lumence
    使用装饰器,是不是该这样写哦 type VisitorDecorator func(VisitorFunc) VisitorFunc type DecoratedVisitor struct { visitor Visitor decorators []VisitorDecorator } func NewDecoratedVisitor(v Visitor, fn ...VisitorDecorator) Visitor { if len(fn) == 0 { return v } return DecoratedVisitor{v, fn} } // Visit implements Visitor func (v DecoratedVisitor) Visit(fn VisitorFunc) error { decoratorLen := len(v.decorators) for i := range v.decorators { d := v.decorators[decoratorLen-i-1] fn = d(fn) } return fn(v.visitor.(*Info), nil) }
    2021-02-25
    1
    3
  • hunknownz
    耗子哥,看最后「装饰器重构」这块,我的理解可能出了问题,你确认下。 k8s 中对于 Visitor 这块有两种结构: 一个是 VisiterList,它的 Visit 方法负责横向聚合各个 visitor 的 Visit 方法,把多个 visitor 合成一个 visitor,执行上存在父子 visitor 的关系,类似文章中把 LogVisitor,NameVisitor,OtherThingsVisitor 聚合成一个 visitor; 另一个是 DecoratedVisitor ,它的 Visit 方法负责纵向聚合多个 VisitorFunc 到一个 visitor 上,使 Visit 方法的逻辑更丰富,没有任何父子嵌套关系,它的 Visit 方法执行时先执行自己聚合的 decorators 方法们,然后再执行传入的 VisitorFunc。 我理解文章中「装饰器重构」是要完成 VisitorList 功能,但是使用了 DecoratedVisitor 这个结构,所以末尾的代码有一些执行不通。
    2022-05-10
  • 黑白灰
    var v Visitor = &info v = LogVisitor{v} v = NameVisitor{v} v = OtherThingsVisitor{v} 请教一下go的,那个特性可以支持这种嵌套赋值
    2021-11-28
    4
  • shangyu
    耗子叔,最后那个NewDecoratedVisitor调用的传餐不对哦?
    2021-02-05
收起评论
显示
设置
留言
4
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部