41 lines
896 B
Go
41 lines
896 B
Go
package visitor
|
|
|
|
import (
|
|
"fmt"
|
|
)
|
|
|
|
// Abstractions ...
|
|
type Visitor interface {
|
|
VisitProductWithHighTask(ProductWithHighTax) float32
|
|
VisitProductWithLowTask(ProductWithLowTax) float32
|
|
}
|
|
|
|
type Visitable interface {
|
|
Accept(Visitor) float32
|
|
}
|
|
|
|
// Visitor
|
|
type TaxVisitor struct {}
|
|
func (v TaxVisitor) VisitProductWithHighTask(p ProductWithHighTax) float32 {
|
|
fmt.Println("Visiting Product With High Tax ...")
|
|
return p.Price * 1.3
|
|
}
|
|
func (v TaxVisitor) VisitProductWithLowTask(p ProductWithLowTax) float32 {
|
|
fmt.Println("Visiting Product With Low Tax ...")
|
|
return p.Price * 1.1
|
|
}
|
|
|
|
// Visitable objects...
|
|
type ProductWithHighTax struct {
|
|
Price float32
|
|
}
|
|
func (p ProductWithHighTax) Accept(v Visitor) float32 {
|
|
return v.VisitProductWithHighTask(p)
|
|
}
|
|
|
|
type ProductWithLowTax struct{
|
|
Price float32
|
|
}
|
|
func (p ProductWithLowTax) Accept(v Visitor) float32 {
|
|
return v.VisitProductWithLowTask(p)
|
|
} |