設計模式golang-裝飾者模式

裝飾者模式

定義

動態地將責任附加到對象上。若要擴展功能,裝飾者提供了比繼承更有彈性的替代方案。

角色

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 的方法。相當於一個結構體來裝飾另外的結構體。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章