学习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 }

 

posted @ 2019-08-27 09:44  卓扬  阅读(1359)  评论(0编辑  收藏  举报