設計模式學習-使用go實現裝飾模式

Rick.lz發表於2021-11-13

裝飾器模式

定義

裝飾模式:動態的給一些物件新增額外的職責,就增加功能來說,裝飾模式比生成子類更靈活。

舉個例子:

我們現在買手機或者電腦,都有基礎配置,然後根據我們選擇的執行記憶體的大小,具體的CPU,手機或電腦的價格最終價格就是不一樣的。這裡就用到裝飾模式,定製的記憶體和CPU對我們的裝置進行了裝飾作用。

看下結構圖

decorator

程式碼實現

// 基礎款 16g運存 10代cpu
type basicPhone struct {
}

func (p *basicPhone) getPrice() int {
	return 2000
}

// 32g運存
type choose32RAMPhone struct {
	phone phone
}

func (r *choose32RAMPhone) getPrice() int {
	price := r.phone.getPrice()
	return price + 500
}

// 11代CPU
type choose11CPUPhone struct {
	phone phone
}

func (r *choose11CPUPhone) getPrice() int {
	price := r.phone.getPrice()
	return price + 1000
}

測試程式碼

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

	choose32RAMPhone := &choose32RAMPhone{
		phone: phone,
	}

	orderPhone := &choose11CPUPhone{
		phone: choose32RAMPhone,
	}

	t.Log(orderPhone.getPrice())
}

優點

1、裝飾器是繼承的有力補充,比繼承靈活,在不改變原有物件的情況下,動態的給一個物件擴充套件功能,即插即用

2、通過使用不用裝飾類及這些裝飾類的排列組合,可以實現不同效果

3、裝飾器模式完全遵守開閉原則

裝飾器模式主要解決繼承關係過於複雜的問題,通過組合來替代繼承。它主要的作用是給原始類新增增強功能。這也是判斷是否該用裝飾器模式的一個重要的依據。除此之外,裝飾器模式還有一個特點,那就是可以對原始類巢狀使用多個裝飾器。為了滿足這個應用場景,在設計的時候,裝飾器類需要跟原始類繼承相同的抽象類或者介面。

缺點

裝飾器模式會增加許多子類,過度使用會增加程式得複雜性。

適用範圍

1、擴充套件一個類的功能。

2、動態增加功能,動態撤銷。

裝飾器模式和橋接模式的區別

兩個模式都是為了解決子類過多問題, 但他們的誘因不同:

1.橋接模式物件自身有,沿著多個維度變化的趨勢, 本身不穩定;

2.裝飾者模式物件自身非常穩定, 只是為了增加新功能/增強原功能。

參考

【文中程式碼】https://github.com/boilingfrog/design-pattern-learning/tree/master/裝飾器模式
【大話設計模式】https://book.douban.com/subject/2334288/
【極客時間】https://time.geekbang.org/column/intro/100039001
【裝飾模式】https://boilingfrog.github.io/2021/11/13/使用go實現裝飾模式/#裝飾器模式

相關文章