意圖:
裝飾器模式動態地將責任附加到物件上。若要擴充套件功能,裝飾者提供了比繼承更有彈性的替代方案。
關鍵程式碼:
裝飾器和被裝飾物件實現同一個介面,裝飾器中使用了被裝飾物件
應用例項:
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 協議》,轉載必須註明作者和本文連結