有很久沒談關於設計模式的內容了,這次我想來談談新的看法。
在這裡我還想再次囉嗦兩句設計的原則:開閉原則,依賴倒置,介面隔離,黎克特制替換原則,最小知識,單一職責。
還有幾個規範:面向介面程式設計是穩定的架構,能使用組合盡量不使用繼承來關聯,重寫破壞了物件的封裝性破壞了開閉原則。
關於設計模式,沒有特定的規範,這只是一種思想,同一種設計模式可能演變出很多類似的變種,這個時候死板硬套並不好,應該理解內在的設計思想,為什麼這麼設計,說不出這麼設計的好處就很有可能造成過度設計,應該盡量避免為了設計模式而設計模式。
掌握設計模式的要點在於角色,和解決的問題,思想。
這次我來聊聊裝飾模式,裝飾模式(decrator despattern),這個模式的意義就是為原來的類新增新的功能,最近也在學習動態**aop等等東西,區別在於動態**更多的是執行時候新增一些通用的功能,而裝飾模式更多的是靜態的在**層面新增新功能,類似**模式當中的靜態模式。
再次重申學習設計模式一定要掌握每個角色的職責和角色之間的關係。
裝飾模式設計的角色有:
介面元件:定義規則,需要實現的方法。
被修飾的類:實現了介面定義的規則。
裝飾類:也實現了介面,它擁有介面的引用,用於指向被修飾的類,這裡類似於**模式。
具體裝飾類:繼承裝飾類,因為裝飾方法可能多種多樣,這樣可以增加擴充套件性。
引用一下百科的uml圖:
我們這裡舉個栗子:
妹紙都喜歡買衣服,買了衣服然後覺得沒配套的褲子,買了褲子覺得應該搭新的衣服,然後又沒褲子了。。總之就是買買買。我們首先抽象定義乙個person
inte***ce
person
實現了該類的girl,這裡我們是被裝飾的類
class
girl
implements
person
}
妹紙看了衣櫃什麼也沒有然後要乙個裝飾:
class
decrator
implements
person
public decrator(person person)
}
然後分別有兩個實現類,要麼去買了牛仔褲,要麼去優衣庫買了衣服:
class
jazz
extends
decrator
// 重寫裝飾的方法
@override
public
void wear()
}class
uniqu
extends
decrator
@override
public
void wear()
}
客戶端使用的時候:
// 沒有裝飾
person girl = new girl();
girl.wear();
system.out.println("----我去買牛仔褲----");
// 牛仔褲裝飾
girl = new jazz(new girl());
girl.wear();
system.out.println("----我去買優衣庫----");
// 優衣庫裝飾
girl = new uniqu(new girl());
girl.wear();
執行結果如下:
我看了看衣櫃--
--我去買牛仔褲--
--我看了看衣櫃
我買了條牛仔褲--
--我去買優衣庫--
--我看了看衣櫃
我買了優衣庫的衣服
關鍵理解幾個角色,定義介面,被修飾,修飾類擁有介面,裝飾類構造方法把被裝飾的儲存進來進行修飾。 設計模式之裝飾設計模式
1.目的 動態擴充套件類的行為 開閉原則 對擴充套件開放,對修改關閉 2.要點 裝飾類和被裝飾類都實現同乙個介面或者繼承同乙個類 3.具體實現 被裝飾元件介面 被裝飾元件實現類實現 抽象類構建被裝飾元件實現被裝飾元件介面 裝飾類繼承抽象類 裝飾類 重寫抽象類方法 裝飾 4.例項 被裝飾類介面 pub...
設計模式之裝飾模式
有時如果需要對某乙個類增加乙個功能,可以使用繼承來實現。但是如果想要只是對某乙個物件來增加一項功能,則可能會用到裝飾模式。裝飾模式的主要作用是動態的給某乙個物件新增某些功能。如果此時使用繼承來新增功能時,會產生大量的子類,導致難以維護。裝飾模式的簡要類圖如下 其中 component為待增加功能 即...
設計模式之裝飾模式
template pattern 即模板模式 核心思想 產品不變的部分首先實現,將易變的部分抽象出來供子類完成。例如 一雙運動鞋大體製作流程各廠家基本一致,但是各環節實現細節可有些不一樣,不一樣的部分抽象出來讓不同廠家實現。即先有個框架,細節交給不同廠家實現 程式設計例項 趙本山小品中提到的將大象裝...