1. 程式人生 > >策略模式+觀察者模式+裝飾者模式

策略模式+觀察者模式+裝飾者模式

策略模式:
定義了演算法族,分別封裝起來,讓它們之間可以互相替換,此模式讓演算法的變化獨立於使用演算法的客戶。
eg:鴨子模型

要點:
1.知道OO基礎,並不足以讓你設計出良好的OO系統。
2.良好的OO設計必須具備可複用、可擴充套件、可維護三個特性。
3.模式可以讓我們建造出具有良好OO設計質量的系統。
4.模式被認為是歷經驗證的OO設計經驗。
5.模式不是程式碼,而是針對設計問題的通用解決方案,你可把它們引用到特定的應用中。
6.模式不是被髮明,而是被發現。
7.大多數的模式和原則,都著眼於軟體變化的主體。
8.大多數的模式都允許系統區域性改變獨立於其它部分。
9.我們常把系統中會變化的部分抽出來封裝。
10.模式讓開發人員之間有共享的語言,能吼最大化溝通的價值。

觀察者模式:
在物件之間定義一對多的依賴,這樣一來,當一個物件改變狀態,依賴它的物件都會收到通知,並自動更新。
eg:訂閱報紙;天氣預報和公告板

要點:
1.觀察者模式定義了物件之間一對多的關係。
2.主體(也就是可觀察者)用一個共同的介面來更新觀察者。
3.觀察者和可觀察者之間用鬆耦合方式結合,可觀察者不知道觀察者的細節,只知道觀察者實現了觀察者介面。
4.使用此模式時,你可從被觀察者推(push)或啦(pull)資料,(然而,推的方式被認為更“正確”)。
5.有多個觀察者時,不可以依賴特定的通知次序。
6.Java中有多種觀察者模式的實現,包括了通用的java.util.Observable.
7.要注意java.util.Observable實現上所帶來的一些問題。
8.如果有必要的化,可以實現自己的Observable,這並不難。
9.Swing大量使用觀察者模式,許多GUI框架也是如此
10.此模式也別應用於很多地方,例如:JavaBeans、RMI。

裝飾者模式:
動態地將責任附加到物件上,若要擴充套件功能,裝飾者提供了比繼承更有彈性的代替方案。
eg:咖啡中加入各種調料;java.io包

要點:
1.繼承屬於擴充套件形式之一,但不見得是達到彈性設計的最佳方式。
2.在我們的設計中,應該允許行為可以被擴充套件,而無須修改現有的程式碼。
3.組合和委託可用於在執行時動態地加上新的行為。
4.除了繼承,裝飾著模式也可以讓我們擴充套件行為。
5.裝飾者模式意味著一群裝飾者類,這些類用來包裝具體元件。
6.裝飾者類反映出被裝飾的元件型別(事實上,它們具有相同的型別,都經過介面或繼承實現)。
7.裝飾者可以在被裝飾者的行為前面與/或後面加上自己的行為,甚至將被裝飾者的行為整個取代掉,而達到特定的目的。
8.你可以使用無數個裝飾者包裝一個元件。
9.裝飾者一般對元件的客戶是透明的,除非客戶程式依賴於元件的具體型別。
10.裝飾者會導致設計中出現許多小物件,如果過度使用,會讓程式變得很複雜。

設計原則
1.找出應用中可能需要變化之處,把它們獨立出來,不要和那些不需要變化的程式碼混在一起。
2.針對介面程式設計,而不是針對實現程式設計。
3.多用組合,少用繼承。
4.為互動物件之間的鬆耦合設計而努力。
5.類應該對擴充套件開放,對修改關閉。