学习Go语言之装饰器模式
一,首先理解装饰器模式:动态的给一个对象增加一些额外的职责,这是在软件设计原则上面,一个功能装饰另一个功能,每个功能遵循同一个接口是这个模式的特征。
二,定义对象接口和装饰抽象类
1 type IDecorate interface { 2 Do() 3 } 4 5 // 装饰器。实现接口,又定义了自己的事件DecorateFun,相当于抽象类 6 type Decorate struct { 7 // 待装饰的抽象类 8 decorate IDecorate 9 } 10 11 func (c *Decorate) DecorateFun(i IDecorate) { 12 c.decorate = i 13 } 14 15 func (c *Decorate) Do() { 16 if c.decorate != nil { 17 c.decorate.Do() 18 } 19 }
三,具体的装饰类
1 // 具体A装饰 2 type DecorateA struct { 3 Base Decorate 4 } 5 6 // 重写方法,隐式实现接口 7 func (c *DecorateA) Do() { 8 fmt.Printf("执行A装饰") 9 c.Base.Do() 10 } 11 12 // 具体B装饰 13 type DecorateB struct { 14 Base Decorate 15 } 16 17 // 重写方法,隐式实现接口 18 func (c *DecorateB) Do() { 19 fmt.Printf("执行B装饰") 20 c.Base.Do() 21 } 22 23 // 具体C装饰 24 type DecorateC struct { 25 Base Decorate 26 } 27 28 // 重写方法,隐式实现接口 29 func (c *DecorateC) Do() { 30 fmt.Printf("执行C装饰") 31 c.Base.Do() 32 }
四,客户端调用。此处需要注意避免贪吃蛇无限循环问题
1 func main() { 2 a := new(DecorateA) 3 b := new(DecorateB) 4 c := new(DecorateC) 5 b.Base.DecorateFun(a) 6 c.Base.DecorateFun(b) 7 c.Do() 8 }