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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值