我正在阅读一本设计模式书,并尝试将这些模式应用到 Go 中,以此作为学习两者的一种方式。
目前我已经达到了装饰者模式,我遇到了一个我很好奇的场景。
这是一些示例代码:
type Beverage interface {
getDescription() string
cost() float64
}
type HouseBlend struct{}
func (hb *HouseBlend) getDescription() string {
return "House Blend Coffee"
}
func (hb *HouseBlend) cost() float64 {
return .89
}
type Mocha struct {
b Beverage
}
func (m *Mocha) getDescription() string {
return m.b.getDescription() + ", Mocha"
}
func (m *Mocha) cost() float64 {
return m.b.cost() + .20
}
有什么区别
var hb Beverage = &HouseBlend{}
//This works since hb is an interface type
hb = &Mocha{
b: hb,
}
和
hb := &HouseBlend{}
//This assignment fails since Mocha is not type HouseBlend
hb = &Mocha{
b: hb,
}
这也有效
hb := *new(Beverage)
hb = &Espresso{}
hb = &Mocha{
b: hb,
}
是否有一种简写方法可以为我的变量hb提供接口类型,或者它是否需要明确以便能够“装饰”我的结构并将变量重新分配给不同的类型?
欢迎任何关于改进装饰器模式和实现干净多态性的建议。谢谢你!
噜噜哒
守着一只汪
相关分类