Go 實現常用設計模式(三)策略模式

pibigstar發表於2019-09-07

意圖:
裝飾器模式動態地將責任附加到物件上。若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。

關鍵程式碼:
裝飾器和被裝飾物件實現同一個介面,裝飾器中使用了被裝飾物件

應用例項:
JAVA中的IO流

new DataInputStream(new FileInputStream("test.txt"));

Go實現裝飾器模式

package decorator

import "fmt"

type Person interface {
    cost() int
    show()
}

// 被裝飾物件
type laowang struct {
}

func (*laowang) show() {
    fmt.Println("赤裸裸的老王。。。")
}
func (*laowang) cost() int {
    return 0
}

// 衣服裝飾器
type clothesDecorator struct {
    // 持有一個被裝飾物件
    person Person
}

func (*clothesDecorator) cost() int {
    return 0
}

func (*clothesDecorator) show() {
}

// 夾克
type Jacket struct {
    clothesDecorator
}

func (j *Jacket) cost() int {
    return j.person.cost() + 10
}
func (j *Jacket) show() {
    // 執行已有的方法
    j.person.show()
    fmt.Println("穿上夾克的老王。。。")
}

// 帽子
type Hat struct {
    clothesDecorator
}

func (h *Hat) cost() int {
    return h.person.cost() + 5
}
func (h *Hat) show() {
    fmt.Println("戴上帽子的老王。。。")
}

測試用例

package decorator

import (
    "fmt"
    "testing"
)

func TestDecorator(t *testing.T) {
    laowang := &laowang{}

    jacket := &Jacket{}
    jacket.person = laowang
    jacket.show()

    hat := &Hat{}
    hat.person = jacket
    hat.show()

    fmt.Println("cost:", hat.cost())
}

具體程式碼

更詳細的程式碼可參考:https://github.com/pibigstar/go-demo 裡面包含了 Go 常用的設計模式、Go 面試易錯點、簡單的小專案(區塊鏈,爬蟲等)、還有各種第三方的對接(redis、sms、nsq、elsticsearch、alipay、oss...),如果對你有所幫助,請給個 Star,你的支援,是我最大的動力!

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章