package main import "fmt" /* 实例 汤宝宝家有一台咖啡机,他会自动给美式咖啡加奶和糖... */ type Drink interface { GetPrice() float64 cost() } type Coffee struct { name string Price float64 } func (c *Coffee) GetPrice() float64 { return c.Price } func (c *Coffee) cost() { fmt.Printf("一杯%s咖啡,价格%.2f元。\n", c.name, c.Price) } type Maker struct { wrappedDrink Drink milkPrice float64 sugarPrice float64 } func (m *Maker) GetPrice() float64 { return m.wrappedDrink.GetPrice() } func (m *Maker) cost() { m.wrappedDrink.cost() fmt.Printf("加了奶和糖,总价%.2f元。\n", m.wrappedDrink.GetPrice()+m.milkPrice+m.sugarPrice) } func main() { fmt.Println("============= 装饰器模式 =============") var coffee, newCoffee Drink fmt.Println("自己泡杯咖啡") coffee = &Coffee{ name: "美式", Price: 10.0, } coffee.cost() fmt.Println("\n用咖啡机泡杯咖啡") newCoffee = &Maker{ wrappedDrink: coffee, milkPrice: 1.0, sugarPrice: 1.0, } newCoffee.cost() fmt.Println() fmt.Println("=========== 装饰器模式结束 ===========") }