创建文件Base.go
package visitor
type Customer interface { // 接待者
Accept(Visitor)
}
type Visitor interface { // 访问者
Visit(Customer)
}
创建文件EnterpriseCustomer.go
package visitor
type EnterpriseCustomer struct {
name string
}
func NewEnterpriseCustomer(name string) *EnterpriseCustomer {
return &EnterpriseCustomer{name: name}
}
func (e *EnterpriseCustomer) Accept(visitor Visitor) {
visitor.Visit(e)
}
创建文件IndividualCustomer.go
package visitor
type IndividualCustomer struct {
name string
}
func NewIndividualCustomer(name string) *IndividualCustomer {
return &IndividualCustomer{name: name}
}
func (e *IndividualCustomer) Accept(visitor Visitor) {
visitor.Visit(e)
}
创建文件CustomerCol.go
package visitor
type CustomerCol struct {
customers []Customer // 接待着集合
}
func (c *CustomerCol) Add(customer Customer) {
c.customers = append(c.customers, customer) // 叠加
}
func (c *CustomerCol) Accept(visitor Visitor) { // 每个服务者都接手访问者
for _, customer := range c.customers {
customer.Accept(visitor)
}
}
创建文件AnalysisVisitor.go
package visitor
import "fmt"
type AnalysisVisitor struct {
}
func (*AnalysisVisitor) Visit(customer Customer) {
switch c := customer.(type) {
case *EnterpriseCustomer:
fmt.Println("analysis enterprise customer", c.name)
}
}
创建文件ServiceRequestVisitor.go
package visitor
import "fmt"
type ServiceRequestVisitor struct {
}
func (*ServiceRequestVisitor) Visit(customer Customer) {
switch c := customer.(type) {
case *EnterpriseCustomer:
fmt.Println("serving enterprise customer", c.name)
case *IndividualCustomer:
fmt.Println("serving individual customer", c.name)
}
}
main.go
package main
import "ssp_api_go/test/design/visitor"
func main() {
c := visitor.CustomerCol{}
c.Add(visitor.NewEnterpriseCustomer("Microsoft"))
//c.Add(visitor.NewEnterpriseCustomer("Google"))
c.Add(visitor.NewIndividualCustomer("Billgates"))
c.Add(visitor.NewEnterpriseCustomer("Google"))
//c.Accept(&visitor.ServiceRequestVisitor{})
c.Accept(&visitor.AnalysisVisitor{})
}