設計模式:裝飾者模式(Go)
什麼是裝飾者模式
裝飾者模式有以下特點:
-
理論上它們是可以無限包裝的(無限套娃)
-
裝飾者和被裝飾者們有相同的超類型(super)
-
想要拓展功能無需修改原有的代碼, 定義一個裝飾者就可以
裝飾者模式使用了下面的設計原則:
-
從」包裝」我們可以看到」多用組合,少用繼承」
-
從」拓展」我們可以看到」開閉原則」
在不必改變原類文件和使用繼承的情況下, 動態地擴展一個對象的功能. 它是通過創建一個包裝對象, 也就是裝飾來包裹真實的對象
描述環節
上面bb完特點和原則之後,我們開始使用這個模式來解決實際問題。
我們以遊戲中角色疊buff為例,如果我們需要很多重buff,怎麼用代碼描述?
首先定義一個超類型,在Go中用接口實現,用來規範描述角色的幾個方法。
type Heros interface {
Description() string
DEF() float32
}
然後這兩個方法一個是描述疊上什麼buff,一個是疊上buff後的防禦力。
type mage struct {
name string
def float32
}
func (m mage) Description() string {
return m.name
}
func (m mage) DEF() float32 {
return m.def
}
首先我們上面定義了一個法師類型,下面我們再寫個buff的類型
type buff struct {
heros Heros
name string
def float32
}
func (b buff) Description() string {
return b.heros.Description()+"+"+b.name
}
func (b buff) DEF() float32 {
return b.heros.DEF() + b.def
}
好了我們寫完了加防禦力buff的類型,那麼使用一下看看。
hero := mage{name: "戰鬥法師", def: 10}
buff1 := buff{heros: hero, name: "魔法結界·神聖", def: 12.2}
buff2 := buff{heros: buff1, name: "生命精髓", def: 3.5}
buff3 := buff{heros: buff2, name: "高階全屬性強化", def: 8}
buff4 := buff{heros: buff3, name: "虛假情報·生命", def: 0}
buff5 := buff{heros: buff4, name: "高階抵抗力強化", def: 15.7}
fmt.Println(buff5.Description())
fmt.Println(buff5.DEF())
{% asset_img 1.png %}
可以看出套了幾層buff後防禦力也漲了好多啊。當然如果想在這個基礎上加上可以提供攻擊力加成的buff的話,只需要再寫一個擁有攻擊力加成的結構體,然後實現上面的接口,就可以再套娃下去,這樣就一個接口,只需要不斷地寫出裝設者的結構體和方法,就能實現非常多的功能。