目录
???????访问者模式(Visitor Pattern)将算法从对象结构中分离出来,从而使算法可以独立于对象而变化。允许在不修改现有代码的情况下向现有对象结构添加新的行为。该模式建立在两个核心组件上:访问者和元素。访问者是一个能够访问所有元素的对象,而元素则是需要接受访问者的对象。在这种模式下,访问者可以在不改变元素本身的情况下对其进行操作。访问者模式的核心思想是,通过让访问者持有某个具体元素的引用,让元素的接受访问者方法中执行具体访问者的操作。
(1)优点:
(2)缺点:
package main
import "fmt"
// 电商平台,需要对用户的购物车中的商品进行不同的操作,例如计算商品总价、打印商品清单等。
// 商品的类型包括书籍(Book)和电子产品(ElectronicProduct)。
// 抽象访问者接口(Visitor):
type Visitor interface {
VisitBook(book *Book)
VisitElectronicProduct(product *ElectronicProduct)
}
// 抽象元素接口(Element)
type Element interface {
Accept(visitor Visitor)
}
// 具体访问者(Concrete Visitor):
type ShoppingCartVisitor struct {
TotalPrice float64
}
func (v *ShoppingCartVisitor) VisitBook(book *Book) {
v.TotalPrice += book.Price
}
func (v *ShoppingCartVisitor) VisitElectronicProduct(product *ElectronicProduct) {
v.TotalPrice += product.Price
}
// 具体元素(Concrete Element):book
type Book struct {
Name string
Price float64
}
func (b *Book) Accept(visitor Visitor) {
visitor.VisitBook(b)
}
// 具体元素(Concrete Element):ElectronicProduct
type ElectronicProduct struct {
Name string
Price float64
}
func (p *ElectronicProduct) Accept(visitor Visitor) {
visitor.VisitElectronicProduct(p)
}
// 对象结构(Object Structure)和具体元素的访问方法
type ShoppingCart struct {
Items []Element
}
func (cart *ShoppingCart) AddItem(item Element) {
cart.Items = append(cart.Items, item)
}
func (cart *ShoppingCart) CalculateTotalPrice(visitor Visitor) float64 {
for _, item := range cart.Items {
item.Accept(visitor)
}
return visitor.(*ShoppingCartVisitor).TotalPrice
}
func main() {
cart := &ShoppingCart{}
book := &Book{Name: "Design Patterns", Price: 49.99}
electronicProduct := &ElectronicProduct{Name: "Smartphone", Price: 599.99}
cart.AddItem(book)
cart.AddItem(electronicProduct)
visitor := &ShoppingCartVisitor{}
totalPrice := cart.CalculateTotalPrice(visitor)
fmt.Printf("Total price: $%.2f\n", totalPrice)
}