一,首先理解裝飾器模式:動態的給一個對象增加一些額外的職責,這是在軟件設計原則上面,一個功能裝飾另一個功能,每個功能遵循同一個接口是這個模式的特征。
二,定義對象接口和裝飾抽象類
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 }