Skip to content

Instantly share code, notes, and snippets.

@ruimo
Last active August 29, 2015 14:14
Show Gist options
  • Save ruimo/655fb08ffd66c849ffe3 to your computer and use it in GitHub Desktop.
Save ruimo/655fb08ffd66c849ffe3 to your computer and use it in GitHub Desktop.
package main
import "fmt"
type NamedVisitor struct {
onNormalName func(NormalName)
onFullName func(FullName)
}
type Named interface {
name() string
accept(visitor *NamedVisitor)
}
type NormalName struct {
firstName string
lastName string
}
type FullName struct {
firstName string
middleName string
lastName string
}
func (p NormalName) name() string {
return p.firstName + " " + p.lastName
}
func (p FullName) name() string {
return p.firstName + " " + p.middleName + " " + p.lastName
}
func (p NormalName) accept(visitor *NamedVisitor) {
visitor.onNormalName(p)
}
func (p FullName) accept(visitor *NamedVisitor) {
visitor.onFullName(p)
}
func NewNamedVisitor(onNormalName func(NormalName), onFullName func(FullName)) *NamedVisitor {
visitor := new(NamedVisitor)
visitor.onNormalName = onNormalName
visitor.onFullName = onFullName
return visitor
}
func main() {
names := []Named{}
name1 := NormalName{"Foo", "Bar"}
names = append(names, name1)
name2 := FullName{"Foo", "Bar", "Baz"}
names = append(names, name2)
for _, p := range names {
fmt.Println(p.name())
}
visitor := NewNamedVisitor(
func(name NormalName) { fmt.Println("Normal name") },
func(name FullName) { fmt.Println("Full name") } )
for _, p := range names {
p.accept(visitor)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment