開閉原則
核心思想:對擴展開放,對修改關閉
開閉原則的含義是:當應用的需求改變時,在不修改軟件實體的源代碼或者二進制代碼的前提下,可以擴展模塊的功能,使其滿足新的需求。
可以通過「抽象約束、封裝變化」來實現開閉原則,即通過接口或者抽象類為軟件實體定義一個相對穩定的抽象層,而將相同的可變因素封裝在相同的具體實現類中。

Windows的桌面主題類圖
里氏替換原則
定義:繼承必須確保超類所擁有的性質在子類中仍然成立
通俗來講就是:子類可以擴展父類的功能,但不能改變父類原有的功能。也就是說:子類繼承父類時,除添加新的方法完成新增功能外,盡量不要重寫父類的方法。
如果程序違背了里氏替換原則,則繼承類的對象在基類出現的地方會出現運行錯誤。這時其修正方法是:取消原來的繼承關係,重新設計它們之間的關係。
關於里氏替換原則的例子,最有名的是「正方形不是長方形」。當然,生活中也有很多類似的例子,例如,企鵝、鴕鳥和幾維鳥從生物學的角度來劃分,它們屬於鳥類;但從類的繼承關係來看,由於它們不能繼承「鳥」會飛的功能,所以它們不能定義成「鳥」的子類。同樣,由於「氣球魚」不會游泳,所以不能定義成「魚」的子類;「玩具炮」炸不了敵人,所以不能定義成「炮」的子類等。

鳥和幾維鳥案例
依賴倒置原則
定義:高層模塊不應該依賴低層模塊,兩者都應該依賴其抽象;抽象不應該依賴細節,細節應該依賴抽象
核心思想:面向接口編程而不是面向實現編程
依賴倒置原則是實現開閉原則的重要途徑之一,它降低了客戶與實現模塊之間的耦合。
依賴倒置原則的主要作用如下
- 依賴倒置原則可以降低類間的耦合性。
- 依賴倒置原則可以提高系統的穩定性。
- 依賴倒置原則可以減少並行開發引起的風險。
- 依賴倒置原則可以提高代碼的可讀性和可維護性。
依賴倒置原則的目的是通過要面向接口的編程來降低類間的耦合性
實現方法:每個類盡量提供接口或抽象類,或者兩者都具備。變量的聲明類型盡量是接口或者是抽象類。任何類都不應該從具體類派生。使用繼承時盡量遵循里氏替換原則。

顧客購物程序
單一職責原則
單一職責原則規定一個類應該有且僅有一個引起它變化的原因,否則類應該被拆分
該原則提出對象不應該承擔太多職責,如果一個對象承擔了太多的職責,至少存在以下兩個缺點:
- 一個職責的變化可能會削弱或者抑制這個類實現其他職責的能力;
- 當客戶端需要該對象的某一個職責時,不得不將其他不需要的職責全都包含進來,從而造成冗餘代碼或代碼的浪費。
核心思想:傾向於專賣店而非大型超市,更強調代碼的內聚性
單一職責原則的核心就是控制類的粒度大小、將對象解耦、提高其內聚性。如果遵循單一職責原則將有以下優點。
- 降低類的複雜度。一個類只負責一項職責,其邏輯肯定要比負責多項職責簡單得多。
- 提高類的可讀性。複雜性降低,自然其可讀性會提高。
- 提高系統的可維護性。可讀性提高,那自然更容易維護了。
- 變更引起的風險降低。變更是必然的,如果單一職責原則遵守得好,當修改一個功能時,可以顯著降低對其他功能的影響。
實現方法:
單一職責原則是最簡單但又最難運用的原則,需要設計人員發現類的不同職責並將其分離,再封裝到不同的類或模塊中。而發現類的多重職責需要設計人員具有較強的分析設計能力和相關重構經驗

大學學生工作管理程序
注意:單一職責同樣也適用於方法。一個方法應該儘可能做好一件事情。如果一個方法處理的事情太多,其顆粒度會變得很粗,不利於重用。
接口隔離原則
要求程序員盡量將臃腫龐大的接口拆分成更小的和更具體的接口,讓接口中只包含客戶感興趣的方法。
接口隔離原則和單一職責都是為了提高類的內聚性、降低它們之間的耦合性,體現了封裝的思想,但兩者是不同的:
- 單一職責原則注重的是職責,而接口隔離原則注重的是對接口依賴的隔離。
- 單一職責原則主要是約束類,它針對的是程序中的實現和細節;接口隔離原則主要約束接口,主要針對抽象和程序整體框架的構建。
接口隔離原則是為了約束接口、降低類對接口的依賴性,遵循接口隔離原則有以下 5 個優點。
- 將臃腫龐大的接口分解為多個粒度小的接口,可以預防外來變更的擴散,提高系統的靈活性和可維護性。
- 接口隔離提高了系統的內聚性,減少了對外交互,降低了系統的耦合性。
- 如果接口的粒度大小定義合理,能夠保證系統的穩定性;但是,如果定義過小,則會造成接口數量過多,使設計複雜化;如果定義太大,靈活性降低,無法提供定製服務,給整體項目帶來無法預料的風險。
- 使用多個專門的接口還能夠體現對象的層次,因為可以通過接口的繼承,實現對總接口的定義。
- 能減少項目工程中的代碼冗餘。過大的大接口裏面通常放置許多不用的方法,當實現這個接口的時候,被迫設計冗餘的代碼。
在具體應用接口隔離原則時,應該根據以下幾個規則來衡量。
- 接口盡量小,但是要有限度。一個接口只服務於一個子模塊或業務邏輯。
- 為依賴接口的類定製服務。只提供調用者需要的方法,屏蔽不需要的方法。
- 了解環境,拒絕盲從。每個項目或產品都有選定的環境因素,環境不同,接口拆分的標準就不同深入了解業務邏輯。
- 提高內聚,減少對外交互。使接口用最少的方法去完成最多的事情。

學生成績管理程序
迪米特法則
定義:只與你的直接朋友交談,不跟「陌生人」說話
含義:如果兩個軟件實體無須直接通信,那麼就不應當發生直接的相互調用,可以通過第三方轉發該調用。其目的是降低類之間的耦合度,提高模塊的相對獨立性。
迪米特法則中的「朋友」是指:當前對象本身、當前對象的成員對象、當前對象所創建的對象、當前對象的方法參數等,這些對象同當前對象存在關聯、聚合或組合關係,可以直接訪問這些對象的方法。
迪米特法則要求限制軟件實體之間通信的寬度和深度,正確使用迪米特法則將有以下兩個優點。
- 降低了類之間的耦合度,提高了模塊的相對獨立性。
- 由於親合度降低,從而提高了類的可復用率和系統的擴展性。
但是,過度使用迪米特法則會使系統產生大量的中介類,從而增加系統的複雜性,使模塊之間的通信效率降低。所以,在釆用迪米特法則時需要反覆權衡,確保高內聚和低耦合的同時,保證系統的結構清晰。
從迪米特法則的定義和特點可知,它強調以下兩點:
- 從依賴者的角度來說,只依賴應該依賴的對象。
- 從被依賴者的角度說,只暴露應該暴露的方法。
所以,在運用迪米特法則時要注意以下 6 點。
- 在類的劃分上,應該創建弱耦合的類。類與類之間的耦合越弱,就越有利於實現可復用的目標。
- 在類的結構設計上,盡量降低類成員的訪問權限。
- 在類的設計上,優先考慮將一個類設置成不變類。
- 在對其他類的引用上,將引用其他對象的次數降到最低。
- 不暴露類的屬性成員,而應該提供相應的訪問器(set 和 get 方法)。
- 謹慎使用序列化(Serializable)功能。

明星與經紀人的關係實例
合成復用原則
它要求在軟件復用時,要盡量先使用組合或者聚合等關聯關係來實現,其次才考慮使用繼承關係來實現。
如果要使用繼承關係,則必須嚴格遵循里氏替換原則。合成復用原則同里氏替換原則相輔相成的,兩者都是開閉原則的具體實現規範。
通常類的復用分為繼承復用和合成復用兩種,繼承復用雖然有簡單和易實現的優點,但它也存在以下缺點:
- 繼承復用破壞了類的封裝性。因為繼承會將父類的實現細節暴露給子類,父類對子類是透明的,所以這種復用又稱為「白箱」復用。
- 子類與父類的耦合度高。父類的實現的任何改變都會導致子類的實現發生變化,這不利於類的擴展與維護。
- 它限制了復用的靈活性。從父類繼承而來的實現是靜態的,在編譯時已經定義,所以在運行時不可能發生變化。
採用組合或聚合復用時,可以將已有對象納入新對象中,使之成為新對象的一部分,新對象可以調用已有對象的功能,它有以下優點。
- 它維持了類的封裝性。因為成分對象的內部細節是新對象看不見的,所以這種復用又稱為「黑箱」復用。
- 新舊類之間的耦合度低。這種復用所需的依賴較少,新對象存取成分對象的唯一方法是通過成分對象的接口。
- 復用的靈活性高。這種復用可以在運行時動態進行,新對象可以動態地引用與成分對象類型相同的對象。
合成復用原則是通過將已有的對象納入新對象中,作為新對象的成員對象來實現的,新對象可以調用已有對象的功能,從而達到復用。

汽車分類
總結
開閉原則是總綱,它告訴我們要對擴展開放,對修改關閉;里氏替換原則告訴我們不要破壞繼承體系;依賴倒置原則告訴我們要面向接口編程;單一職責原則告訴我們實現類要職責單一;接口隔離原則告訴我們在設計接口的時候要精簡單一;迪米特法則告訴我們要降低耦合度;合成復用原則告訴我們要優先使用組合或者聚合關係復用,少用繼承關係復用。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/314190.html