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


裝飾器模式

定義

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

舉個栗子:

我們現在買手機或者電腦,都有基礎配置,然后根據我們選擇的運行內存的大小,具體的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實現裝飾模式/#裝飾器模式


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM