115 | 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
- 深入了解
- 翻译
- 解释
- 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《左耳听风》,新⼈⾸单¥98
《左耳听风》,新⼈⾸单¥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) }13
- hunknownz耗子哥,看最后「装饰器重构」这块,我的理解可能出了问题,你确认下。 k8s 中对于 Visitor 这块有两种结构: 一个是 VisiterList,它的 Visit 方法负责横向聚合各个 visitor 的 Visit 方法,把多个 visitor 合成一个 visitor,执行上存在父子 visitor 的关系,类似文章中把 LogVisitor,NameVisitor,OtherThingsVisitor 聚合成一个 visitor; 另一个是 DecoratedVisitor ,它的 Visit 方法负责纵向聚合多个 VisitorFunc 到一个 visitor 上,使 Visit 方法的逻辑更丰富,没有任何父子嵌套关系,它的 Visit 方法执行时先执行自己聚合的 decorators 方法们,然后再执行传入的 VisitorFunc。 我理解文章中「装饰器重构」是要完成 VisitorList 功能,但是使用了 DecoratedVisitor 这个结构,所以末尾的代码有一些执行不通。
- 黑白灰var v Visitor = &info v = LogVisitor{v} v = NameVisitor{v} v = OtherThingsVisitor{v} 请教一下go的,那个特性可以支持这种嵌套赋值3
- shangyu耗子叔,最后那个NewDecoratedVisitor调用的传餐不对哦?
收起评论