設計模式:裝飾者模式(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的話,只需要再寫一個擁有攻擊力加成的結構體,然後實現上面的接口,就可以再套娃下去,這樣就一個接口,只需要不斷地寫出裝設者的結構體和方法,就能實現非常多的功能。

Tags: