装饰器(Decorator)模式是一种结构型设计模式。通过装饰器模式可以为一个对象添加额外的功能而不需对其作出调整。
有时候我们需要在一个类的基础上扩展另一个类,例如,一个披萨类,你可以在披萨类的基础上增加番茄披萨类和芝士披萨类。此时就可以使用装饰模式。
简单来说,装饰模式就是将对象封装到另一个对象中,来为原对象绑定新的行为。如果你希望在无需修改代码的情况下使用对象,并且希望为对象新增额外的行为,就可以考虑使用装饰模式。
代码示例:
package main
import "fmt"
// pizza接口
type pizza interface {
getPrice() int
}
// 基础pizza
type base struct{}
func (p *base) getPrice() int {
return 15
}
// 加番茄的披萨
type tomatoTopping struct {
pizza pizza
}
func (c *tomatoTopping) getPrice() int {
pizzaPrice := c.pizza.getPrice()
return pizzaPrice + 10
}
// 加芝士的披萨
type cheeseTopping struct {
pizza pizza
}
func (c *cheeseTopping) getPrice() int {
pizzaPrice := c.pizza.getPrice()
return pizzaPrice + 20
}
func main() {
// 基础披萨 15元
pizza := &base{}
// 加点芝士 +20元
pizzaWithCheese := &cheeseTopping{
pizza: pizza,
}
// 再加点番茄 +10元
pizzaWithCheeseAndTomato := &tomatoTopping{
pizza: pizzaWithCheese,
}
// 芝士番茄披萨的总价
fmt.Printf("price is %d\n", pizzaWithCheeseAndTomato.getPrice())
}
运行示例,输出结果:
price is 45
参考文档: