裝飾者模式
定義
動態地將責任附加到對象上。若要擴展功能,裝飾者提供了比繼承更有彈性的替代方案。
角色
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 的方法。相當於一個結構體來裝飾另外的結構體。