装饰者模式
定义
动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
角色
1.装饰抽象接口
2.装饰者
3.被装饰者
角色关系:装饰者和被装饰者通过装饰抽象接口关联。
例子
一个早餐铺,卖早餐事物包子、豆浆、鸡蛋,客户可以组合购买。
//抽象装饰接口
type Food interface {
GetFoodDesc()string
Cost()float64
}
//装饰者
//baozi
type Baozi struct {
BaseFood Food
Fee float64
}
func (b *Baozi)GetFoodDesc()string{
if b.BaseFood == nil{
retrun "baozi"
}
retrun b.GetFoodDesc() + " baozi"
}
func (b *Baozi)Cost()float64{
if b.BaseFood == nil{
return b.fee
}
return b.Fee +b.Cost()
}
//Doujiang
type Doujiang struct {
BaseFood Food
Fee float64
}
func (d *Doujiang)GetFoodDesc()string{
if b.BaseFood == nil{
retrun "doujiang"
}
retrun d.GetFoodDesc() + " doujiang"
}
func (d *Doujiang)Cost()float64{
if b.BaseFood == nil{
return d.Fee
}
return d.GetFoodDesc() + d.Fee
}
func main(){
//买一个包子
buyBaozi := &Baozi{}
buyBaozi.Fee = 1.0
//再买一个包子
oneMoreBaozi := &Baozi{
BaseFood:buyBaozi,
Fee:1.0,
}
//计算价格
fmt.Println(oneMoreBaozi.GetFoodDesc())
fmt.Println(oneMoreBaozi.Cost())
//再买一个豆浆
moreDoujiang := &Doujiang{
BaseFood:oneMoreBaozi,
Fee:2.0,
}
//最后计算价格
fmt.Println(moreDoujiang.GetFoodDesc())
fmt.Println(moreDoujiang.Cost())
}
总结
就是多个实现相同接口的结构体,把结构体做为一个接口传入另外一个结构体,另外一个结构体实现接口interface方法的时候,可以应用传入的接口interface 的方法。相当于一个结构体来装饰另外的结构体。