设计模式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 的方法。相当于一个结构体来装饰另外的结构体。

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