設計模式(1)之物件導向設計原則
來源:互聯網
上載者:User
物件導向設計原則是學習設計模式的基礎,每一種設計模式都符合某一種或者多種物件導向設計原則。通過在軟體開發中使用這些原則可以提高軟體的可維護行和可用性,讓我們可以設計出更加靈活也更加容易擴充的軟體系統,實現可維護可複用的目標。 準確的理解物件導向原則有力與我們更好的學習和理解設計模式。 1.單一職責原則 一個對象應該只包含單一的職責,病也該職責被完整的封裝在一個類中。另一種定義是就一個類而言,應該僅有一個引起它變化的原因。 一個類應該只負責一種職責,如果職責太多,將導致系統非常脆弱,可複用性較低,系統的可維護行也被降低。 2.開閉原則 一個軟體實體應當對擴充開發,對修改關閉。比如要增加一個新的產品類,還需要修改其他代碼,這就不算是遵守開閉原則。 在設計一個模組的時候,應使是這個模組可以在不被修改的前提下進行擴充,即實現在不修改原始碼的情況下改變這個模組的行為。 為了滿足開閉原則,需要對系統進行抽象化設計,抽象化是開閉原則的關鍵。如果需要修改系統的行為,無需對抽象層進行改動,只需要增加新的具體類來實現新的業務功能即可,實現在不修改已有代碼的基礎上擴充系統功能,達到開閉原則的要求。 3.裡氏代換原則 在軟體中如果能夠使用基類對象,那麼一定能夠使用其子類對象。把基類都替換成他的子類,程式將不會產生任何錯誤和異常。然過來則不成立,如果一個軟體實體使用的是一個子類的話,那麼他不一定能使用基類。 子類的所有方法必須在父類中聲明,或子類必須實現父類中聲明的所有方法。 在運用裡氏代換原則時,盡量把父類設計為抽象類別或者借口,讓子類繼承父類或者實現父類借口,並實現在父類中聲明的方法,這樣,運行時,子類執行個體就可以替換父類執行個體,我們可以很方便的擴充系統的功能,同事霧須修改原有子類的代碼,增加新的功能可以通過增加一個新的子類來實現。 裡氏代換原則是開閉原則的具體實現手段中之一。 4.依賴倒轉原則 高層模組不應該依賴底層模組,他們都應該依賴抽象。抽象不應該依賴於細節,細節應該依賴於抽象。 代碼要依賴於抽象的類,而不要依賴具體的類。要針對介面或者抽象類別進行編程,而不要針對具體的類編程。也就是說,在程式碼中傳遞參數時活在組合彙總關係的時候,盡量引用層次高的抽象層類,即使用抽象類別和介面進行變數類型生命、方法傳回型別聲明以及資料類型的轉換,而不要用具體類來做這些事情。為了確保依賴原則的成立,具體類應該只實現介面和抽象類別中的方法,不能增加多餘的方法,否則無法調用增加的方法。 實現開閉原則的關鍵就是抽象化,並且從抽象化匯出具體化實現。如果說開閉原則是物件導向的設計目標,那麼依賴倒轉原則就是物件導向設計的主要手段。有了抽象層,可以使系統有關更好的靈活性。在程式中金蓮使用抽象類別和介面進行編程,而將具體類寫在設定檔中,如果系統行為發生變化,只需要擴充抽象類別和介面,並修改設定檔,而無需修改原代碼而達到擴充系統功能的目的,從而滿足了閉合原則的要求。 依賴倒轉原則要求用戶端依賴於抽象耦合,以抽象的方式耦合是依賴倒轉原則的關鍵。由於一個抽象耦合關係總要涉及到具體類從抽象類別繼承,並且需要保證在任何引用基類的地方都可以替換為子類,因此 裡氏替換原則是依賴倒轉原則的基礎。 5.介面隔離原則 一旦一個介面太大,則需要將它分割成一些更些小的介面,使用該介面的用戶端僅需要知道與之相關的方法即可。 實質上,介面隔離原則是指使用多個專門的介面,而不是使用單一的總介面,每一個介面應該承擔一種相對獨立的角色,不該乾的事情一件不幹,該乾的一件都不能少幹。 在使用介面隔離原則時,要把握好介面的粒度,如果太小 則導致系統介面泛濫,不利於維護;介面也不能太大,太大的介面將違背介面隔離原則,靈活性較差,使用不方便。一般 介面中包含某一類用戶端需要的方法即可。 6.合成複用原則 合成複用原則是物件導向設計中非常重要的一條原則,為了降低系統中類之間的耦合度,該原則提倡少用繼承關係,多用關聯關係。 合成複用原則就是指在一個新的對象裡通過關聯關係,包括組合關係和彙總關係,來使用一些已經存在的對象,使之成為新對象的一步文。新對象通過委派調用已有對象的方法達到複用其已有功能的目的。簡言之:要盡量使用組合或者彙總關係。少用繼承。 7.迪米特法則 迪米特法則要求一個軟體實體應當儘可能的減少與其他實體發生相互作用。