利用繼承來提供對象的行為,會導致: 1、代碼在多個子類中重覆 2、很難知道所有鴨子的全部行為 3、運行時的行為不易改變 4、改變會牽一發而動全身,造成其他鴨子不想要的改變 設計原則 1 :找出應用之中可能需要變化之處,把他們獨立出來,不要和那些不需要變化的代碼混在一起。 註釋:把會變化的部分取出並“ ...
利用繼承來提供對象的行為,會導致: 1、代碼在多個子類中重覆 2、很難知道所有鴨子的全部行為 3、運行時的行為不易改變 4、改變會牽一發而動全身,造成其他鴨子不想要的改變 設計原則 1 :找出應用之中可能需要變化之處,把他們獨立出來,不要和那些不需要變化的代碼混在一起。 註釋:把會變化的部分取出並“封裝”起來,以便以後可以輕易的改動或者擴充此部分,好讓其他部分不受影響。代碼變化引起的不經意後果變少,系統變得更有彈性。 例:在設計鴨子類Duck時,鴨子的行為包括飛和叫,不同鴨子的行為是不同的,所以對於鴨子類Duck來說,行為飛和叫是會變化的部分,所以應當取出並“封裝”起來,建立一組新類來代表每個行為。 設計原則 2:針對介面編程,而不是針對實現編程。實現行為與主體分離 註釋:利用介面代表每個行為,而行為的每個實現都將實現其中的一個介面。 “針對介面編程”真正的意思是 “針對超類型編程”。 這裡“介面”有多個含義,介面是一個“概念”,也是一種java的interface構造。 “針對超類型編程”可以 理解為:變數的聲明類型應該是超類型,通常是一個抽象類或者是一個介面,如此,只要是實現此超類型的類所產生的對象,都可以指定給這個變數。這也意味著,聲明類時不用理會以後執行時的真正對象類型。
設計原則 3:多用組合,少用繼承
使用組合建立系統具有很大的彈性,不僅可將演算法族封裝成類,更可以“在運行時動態的改變行為”,只要組合的行為對象符合正確的介面標準即可。 設計原則 4:為了交互對象之間的松耦合設計而努力 松耦合的設計之所以能讓我們建立有彈性的OO系統,能夠應對變化,是因為對象之間的互相依賴降到了最低。設計原則 5
:類應該對擴展開放,對修改關閉 目標是允許類容易擴展,在不修改現有代碼的情況下,就可搭配新的行為。這樣的設計具有彈性可以應對改變,可以接受新的功能來應對改變的需求。設計原則 6
:“最少知識”原則 減少對象之間的,只留下幾個必須的。不要讓太多類耦合在一起。免得修改系統中的一部分。會影響到其他部分。 對任何對象而言,在該對象的方法內,我們應該只調用以下範圍的方法: 1、該對象本身; 2、被當做方法的參數而傳遞進來的對象; 3、此方法所創建或實例化的對象; 4、對象的任何組件;設計原則 7:“好萊塢 ”原則
允許底層組件掛鉤到系統上,但是高層組件會決定什麼時候和怎樣使用這些底層組件。 設計原則 8:單一責任 一個類應該只有一個引起變化的原因 類的每一個責任都有改變的潛在區域。超過一個責任,意味著超過一個改變的區域。 參考資料:《Head First 設計模式》