简介
装饰着模式是这样的一种模式,即在原有类的基础上进行装饰,然后添加新的功能模式,比如一家咖啡连锁店卖咖啡,可能需要按照顾客的要求进行个性化配置,需要添加多种原料并计算价格。
类图
我们构造的类图如下所示:
这里是个简单的装饰器模型,利用组合和实现的联系,以要添加的原料作为主对象完成对深色烘培咖啡的加料和价格的计算,其中摩卡和牛奶对象被称为装饰者。
代码实现
package main
import "fmt"
type component interface {
getdescription()
cost() float64
}
type DarkRoast struct {
}
package main
import "fmt"
type component interface {
getdescription()
cost() float64
}
type DarkRoast struct {
}
func (this * DarkRoast)getdescription() {
fmt.Printf("DarkRoast")
}
func (this * DarkRoast)cost() float64 {
return 1.9
}
type Mocha struct {
beverage component
}
func (this * Mocha)getdescription() {
fmt.Printf("Mocha + ")
this.beverage.getdescription()
}
func (this * Mocha)cost() float64 {
return 0.5 + this.beverage.cost()
}
type Milk struct {
beverage component
}
func (this * Milk)getdescription() {
fmt.Printf("Milk + ")
this.beverage.getdescription()
}
func (this * Milk)cost() float64 {
return 0.5 + this.beverage.cost()
}
func main() {
beverage := new (DarkRoast)
beverage2 := new(Mocha)
beverage2.beverage = beverage
beverage3 := new(Milk)
beverage3.beverage = beverage2
beverage3.getdescription()
fmt.Printf(" $%f\n",beverage3.cost())
}
运行结果如下所示:
Milk + Mocha + DarkRoast $2.900000
总结
优点:装饰者模式能够动态的将责任附加到对象上。想要扩展功能,装饰者有别于继承的另一种选择。
缺点:装饰者会导致设计中出现许多小对象,如果过度使用,会让程序变的复杂。