kubectl的vistor模式


package main

import (
	"encoding/json"
	"encoding/xml"
	"log"
)
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)
}

func JsonVisitor(shape Shape) {
	log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
	bytes, err := json.Marshal(shape)
	if err != nil {
		panic(err)
	}
	log.Println(string(bytes))
}

func XmlVisitor(shape Shape) {
	log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
	bytes, err := xml.Marshal(shape)
	if err != nil {
		panic(err)
	}
	log.Println(string(bytes))
}

func main() {
	c := Circle{10}
	r :=  Rectangle{100, 200}
	shapes := []Shape{c, r}

	for _, s := range shapes {
		s.accept(JsonVisitor)
		s.accept(XmlVisitor)
	}

}

输出结果是

2022/04/19 14:31:15 temp.go:37: {"Radius":10}
2022/04/19 14:31:15 temp.go:46: <Circle><Radius>10</Radius></Circle>
2022/04/19 14:31:15 temp.go:37: {"Width":100,"Heigh":200}
2022/04/19 14:31:15 temp.go:46: <Rectangle><Width>100</Width><Heigh>200</Heigh></Rectangle>
package  main

import "fmt"

type VisitorFunc func(*Info, error) error

type Visitor interface {
Visit(VisitorFunc) error
}

type Info struct {
Namespace   string
Name        string
OtherThings string
}
func (info *Info) Visit(fn VisitorFunc) error {
return fn(info, nil)
}


type NameVisitor struct {
visitor Visitor
}

func (v NameVisitor) Visit(fn VisitorFunc) error {
return v.visitor.Visit(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
})
}


type OtherThingsVisitor struct {
visitor Visitor
}

func (v OtherThingsVisitor) Visit(fn VisitorFunc) error {
return v.visitor.Visit(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
})
}


type LogVisitor struct {
visitor Visitor
}

func (v LogVisitor) Visit(fn VisitorFunc) error {
return v.visitor.Visit(func(info *Info, err error) error {
fmt.Println("LogVisitor() before call function")
err = fn(info, err)
fmt.Println("LogVisitor() after call function")
return err
})
}


func main() {
info := Info{}
var v Visitor = &info
v = LogVisitor{v}
v = NameVisitor{v}
v = OtherThingsVisitor{v}

loadFile := func(info *Info, err error) error {
info.Name = "Hao Chen"
info.Namespace = "MegaEase"
info.OtherThings = "We are running as remote team."
return nil
}
v.Visit(loadFile)
}

输出结果是

LogVisitor() before call function
NameVisitor() before call function
OtherThingsVisitor() before call function
==> OtherThings=We are running as remote team.
OtherThingsVisitor() after call function
==> Name=Hao Chen, NameSpace=MegaEase
NameVisitor() after call function
LogVisitor() after call function

posted on 2022-04-19 14:49  yangras  阅读(34)  评论(0编辑  收藏  举报

导航