裝飾器模式
定義
裝飾模式:動態的給一些物件新增額外的職責,就增加功能來說,裝飾模式比生成子類更靈活。
舉個例子:
我們現在買手機或者電腦,都有基礎配置,然後根據我們選擇的執行記憶體的大小,具體的CPU,手機或電腦的價格最終價格就是不一樣的。這裡就用到裝飾模式,定製的記憶體和CPU對我們的裝置進行了裝飾作用。
看下結構圖
程式碼實現
// 基礎款 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實現裝飾模式/#裝飾器模式