1.開閉原則
在設計乙個模組時,應當使這個模組可以在不被修改的前提下被擴充套件。開閉原則從另外乙個角度講述,就是「對可變性的封裝原則」,即找到乙個系統的可變因素,將之封裝起來。這意味著兩點:
可變性應當被封裝到乙個物件裡面。繼承應當被看做封裝變化的方法,而不是從一般物件生成特殊物件的方法。
一種可變性不應當與另一種可變性混合在一起,實踐上,通常類圖的繼承結構不會超過兩層。
「將條件轉移語句改寫成為多型性」,將乙個進行多次條件轉移的商業邏輯封裝到不同的具體子類。
如果乙個條件轉移語句沒有涉及重要的商務邏輯,或者不會隨著時間的變化而變化,也不意味著任何的可擴充套件性,那麼它就沒有涉及任何有意義的可變化。這就沒必要轉成多型性。
2.黎克特制代換原則
乙個軟體實體如果使用的是乙個基類的話,那麼一定適用於其子類,而且它根本不能察覺出基類物件和子類物件的區別。
3.依賴倒轉原則
有兩種表述
要依賴於抽象,不要依賴於具體。傳統過程性系統設計方法傾向於使高層次的模組依賴於低層次的模組,抽象層次依賴於具體層次。倒轉,就是要把這種錯誤依賴關係倒轉過來。
抽象層次包含應用系統的商務邏輯和巨集觀的,對整個系統來說重要的戰略性決定,是必然性的體現。
只要乙個被引用的物件存在抽象型別,就應當在任何引用此物件的地方使用抽象型別,包括引數的型別宣告、方法返回型別的宣告、屬性變數的型別宣告等。
多個工廠模式,解決了建立過程中的依賴倒轉問題。
任何方法無法迴避j**a語言要求的new關鍵字和直接呼叫具體類的構造子的做法。簡單工廠模式將這個違反「開-閉」原則以及依賴倒轉原則的做法封裝到了乙個類裡面,而工廠模式將這個違反原則的做法推遲到了具體工廠角色。
預設適配模式
抽象類具有提供預設實現的優點,j**a介面具有其他優點,所以預設適配模式聯合使用兩者。宣告型別的工作仍然由
j**a
介面承擔,同時給出j**a
抽象類,為介面提供乙個預設實現。如果需要加乙個方法,那只用向抽象類加乙個具體實現就可以。j**aapi很多使用這種模式,命名規範為abstract+介面名,如abstractcollection。
有些具體類非常穩定,不會發生變化,這時不需要用乙個抽象型別。
4.介面隔離原則
使用多個專門的介面,比使用單一介面要好。換言之,乙個類對另乙個類的依賴性,應當建立在最小的介面上。
準確而恰當地劃分角色以及角色所對應的介面,是物件導向設計的乙個重要組成部分。
5.組合/聚合復用原則
要盡量使用關聯,而不是繼承。
組合是值的聚合,聚合是引用的聚合。
6.迪公尺特法則
朋友的條件
缺點:遵循類之間的迪公尺特法則,會讓系統的區域性設計簡化,每個區域性都不會和遠距離的物件有直接的關聯,但會造成系統的不同模組間的通訊效率降低,使系統的不同模組間不容易協調。
為了克服狹義的迪公尺特法則的缺點,可以使用依賴倒轉原則,引入乙個抽象的型別引用「抽象陌生人」物件,使「某人」依賴於「抽象陌生人』。換言之,就是將「抽象陌生人」變成朋友。
廣義迪公尺特法則在類的設計上的體現
廣義迪公尺特法則在**上的體現
7.系統可擴充套件性、靈活性、可插入性和設計原則的關係
系統的可擴充套件性由開-閉原則,黎克特制代換原則,依賴倒轉原則和組合/聚合復用原則所保證的。
系統靈活性由開-閉原則,迪公尺特法則,介面隔離原則所保證的。
系統可插入性由開-閉原則,黎克特制代換原則,依賴倒轉原則和組合/聚合復用原則所保證的。
8.小結
設計原則對系統設計提供指導,但並不能僵硬的理解原則。需要全面的了解原則制定的原因,原則的優點和缺點,結合實際,合理利用原則。只要有足夠的理由,在一些場合甚至可以做一些「反原則」的設計。
物件導向設計原則
oo原則 封裝變化 多用組合,少用繼承 針對介面程式設計,不針對實現程式設計 為互動物件之間的松耦合而努力 類應該對擴充套件開放,對修改關閉 依賴抽象,不要依賴具體類 只和朋友交談 別找我,我會找你 類應該只有乙個改變的理由 從設計原則到設計模式 針對介面程式設計,而不是針對實現程式設計 客戶無需知...
物件導向設計原則
物件設計原則 物件導向設計原則 物件導向設計的基石是 開 閉 原則。開一閉 原則講的是 乙個軟體實體應當對擴充套件開放,對修改關閉。這個規則說的是,在設計乙個模組的時候,應當使這個模組可以在不被修改的前提下被擴充套件。從另外乙個角度講,就是所謂的 對可變性封裝原則 對可變性封裝原則 意味著兩點 1 ...
物件導向設計原則
oo原則 封裝變化 多用組合,少用繼承 針對介面程式設計,不針對實現程式設計 為互動物件之間的松耦合而努力 類應該對擴充套件開放,對修改關閉 依賴抽象,不要依賴具體類 只和朋友交談 別找我,我會找你 類應該只有乙個改變的理由 從設計原則到設計模式 針對介面程式設計,而不是針對實現程式設計 客戶無需知...