设计模式之七大原则
設計模式的七大原則
- 設計模式的七大原則
- 1.開閉原則(Open Closed Principle,OCP)
- 軟件實體應當對擴展開放,對修改關閉
- 2. 里氏替換原則(Liskov Substitution Principle,LSP)
- 子類可以擴展父類的功能,但不能改變父類原有的功能
- 3. 依賴倒置原則(Dependence Inversion Principle,DIP)
- 要面向接口編程,不要面向實現編程。
- 4. 單一職責原則(Single Responsibility Principle,SRP)
- 實現類要職責單一
- 5. 接口隔離原則(Interface Segregation Principle,ISP)
- 接口隔離原則是為了約束接口、降低類對接口的依賴性
- 6. 迪米特法則(Law of Demeter,LoD)
- 只與你的直接朋友交談,不跟“陌生人”說話。
- 7. 合成復用原則(Composite Reuse Principle,CRP)
- 優先使用組合或者聚合關系復用,少用繼承關系復用。
設計模式的七大原則
1.開閉原則(Open Closed Principle,OCP)
軟件實體應當對擴展開放,對修改關閉
開閉原則的含義是:當應用的需求改變時,在不修改軟件實體的源代碼或者二進制代碼的前提下,可以擴展模塊的功能,使其滿足新的需求。
開閉原則的作用:
開閉原則是面向對象程序設計的終極目標,它使軟件實體擁有一定的適應性和靈活性的同時具備穩定性和延續性。具體來說,其作用如下。
軟件遵守開閉原則的話,軟件測試時只需要對擴展的代碼進行測試就可以了,因為原有的測試代碼仍然能夠正常運行。
粒度越小,被復用的可能性就越大;在面向對象的程序設計中,根據原子和抽象編程可以提高代碼的可復用性。
遵守開閉原則的軟件,其穩定性高和延續性強,從而易于擴展和維護。
開閉原則的實現方法:
可以通過“抽象約束、封裝變化”來實現開閉原則,即通過接口或者抽象類為軟件實體定義一個相對穩定的抽象層,而將相同的可變因素封裝在相同的具體實現類中。
因為抽象靈活性好,適應性廣,只要抽象的合理,可以基本保持軟件架構的穩定。而軟件中易變的細節可以從抽象派生來的實現類來進行擴展,當軟件需要發生變化時,只需要根據需求重新派生一個實現類來擴展就可以了。
2. 里氏替換原則(Liskov Substitution Principle,LSP)
子類可以擴展父類的功能,但不能改變父類原有的功能
里氏替換原則的定義
里氏替換原則(Liskov Substitution Principle,LSP)繼承必須確保超類所擁有的性質在子類中仍然成立(Inheritance should ensure that any property proved about supertype objects also holds for subtype objects)。
里氏替換原則是繼承復用的基礎,它反映了基類與子類之間的關系,是對開閉原則的補充,是對實現抽象化的具體步驟的規范。
里氏替換原則的作用
里氏替換原則的實現方法
里氏替換原則通俗來講就是:子類可以擴展父類的功能,但不能改變父類原有的功能。也就是說:子類繼承父類時,除添加新的方法完成新增功能外,盡量不要重寫父類的方法。
如果通過重寫父類的方法來完成新的功能,這樣寫起來雖然簡單,但是整個繼承體系的可復用性會比較差,特別是運用多態比較頻繁時,程序運行出錯的概率會非常大。
如果程序違背了里氏替換原則,則繼承類的對象在基類出現的地方會出現運行錯誤。這時其修正方法是:取消原來的繼承關系,重新設計它們之間的關系。
3. 依賴倒置原則(Dependence Inversion Principle,DIP)
依賴倒置原則的原始定義為:高層模塊不應該依賴低層模塊,兩者都應該依賴其抽象;抽象不應該依賴細節,細節應該依賴抽象
要面向接口編程,不要面向實現編程。
依賴倒置原則是實現開閉原則的重要途徑之一,它降低了客戶與實現模塊之間的耦合。
依賴、倒置原則的作用
- 依賴倒置原則的主要作用如下。
- 依賴倒置原則可以降低類間的耦合性。
- 依賴倒置原則可以提高系統的穩定性。
- 依賴倒置原則可以減少并行開發引起的風險。
- 依賴倒置原則可以提高代碼的可讀性和可維護性。
依賴倒置原則的實現方法
依賴倒置原則的目的是通過要面向接口的編程來降低類間的耦合性,所以我們在實際編程中只要遵循以下4點,就能在項目中滿足這個規則。
4. 單一職責原則(Single Responsibility Principle,SRP)
實現類要職責單一
這里的職責是指類變化的原因,單一職責原則規定一個類應該有且僅有一個引起它變化的原因,否則類應該被拆分。一個類只負責一個功能
該原則提出對象不應該承擔太多職責,如果一個對象承擔了太多的職責,至少存在以下兩個缺點:
- 一個職責的變化可能會削弱或者抑制這個類實現其他職責的能力;
- 當客戶端需要該對象的某一個職責時,不得不將其他不需要的職責全都包含進來,從而造成冗余代碼或代碼的浪費。
單一職責原則的優點
單一職責原則的核心就是控制類的粒度大小、將對象解耦、提高其內聚性。如果遵循單一職責原則將有以下優點。
- 降低類的復雜度。一個類只負責一項職責,其邏輯肯定要比負責多項職責簡單得多。
- 提高類的可讀性。復雜性降低,自然其可讀性會提高。
- 提高系統的可維護性。可讀性提高,那自然更容易維護了。
- 變更引起的風險降低。變更是必然的,如果單一職責原則遵守得好,當修改一個功能時,可以顯著降低對其他功能的影響。
單一職責原則的實現方法
單一職責原則是最簡單但又最難運用的原則,需要設計人員發現類的不同職責并將其分離,再封裝到不同的類或模塊中。而發現類的多重職責需要設計人員具有較強的分析設計能力和相關重構經驗。
5. 接口隔離原則(Interface Segregation Principle,ISP)
接口隔離原則是為了約束接口、降低類對接口的依賴性
要求程序員盡量將臃腫龐大的接口拆分成更小的和更具體的接口,讓接口中只包含客戶感興趣的方法。
要為各個類建立它們需要的專用接口,而不要試圖去建立一個很龐大的接口供所有依賴它的類去調用。
接口隔離原則和單一職責都是為了提高類的內聚性、降低他們之間的耦合性,體現了封裝的思想,但兩者是不同的:
- 單一職責原則注重的是職責,而接口隔離原則注重的是對接口依賴的隔離
- 單一職責原則主要是約束類,它針對的是程序中的實現和細節;接口隔離原則主要約束接口,主要針對抽象和程序整體框架的構建
接口隔離原則的優點:
接口隔離原則是為了約束接口、降低類對街廓的依賴性,遵循接口隔離原則有以下5個優點。
接口隔離原則的實現方法:
- 接口盡量小,但是要有限度。一個接口只服務于一個子模塊或業務邏輯
- 為依賴接口的類定制服務。只提供調用者需要的方法,屏蔽不需要的方法。
- 了解環境,拒絕盲從。每隔新項目或產品有選定的環境因素,環境不同,接口拆分的標準就不同,深入了解業務邏輯
- 提高內聚,減少對外交互。使接口用最少的方法去完成最多的事情。
6. 迪米特法則(Law of Demeter,LoD)
只與你的直接朋友交談,不跟“陌生人”說話。
迪米特法則的定義是:只與你的直接朋友交談,不跟“陌生人”說話。
其含義是:如果兩個軟件實體無需直接通信,那么就不應當發生字節的相互調用,可以通過第三方轉發該調用。其目的是降低類之間的耦合度,提高模塊的相對獨立性
迪米特法則中的“朋友”是指:當前對象本身、當前對象的成員對象、當前對象所創建的對象、當前對象的方法參數等,這些對象同當前對象存在關聯、聚合或組合關系,可以直接訪問這些對象的方法。
迪米特法則的優點
迪米特法則要求限制軟件實體之間通信的寬度和深度,有如下2個優點:
迪米特法則的實現方法
它強調以下兩點:
所以,在運用迪米特法則時要注意一下6點:
7. 合成復用原則(Composite Reuse Principle,CRP)
優先使用組合或者聚合關系復用,少用繼承關系復用。
它要求在軟件復用時,要盡量先使用組合或者聚合等關聯關系來實現,其次才考慮使用繼承關系來實現。
如果要使用繼承關系,則必須嚴格遵循里氏替換原則。合成復用原則同里氏替換原則相輔相成的,兩者都是開閉原則的具體實現規范。
合成復用原則的重要性:
通常類的復用分為繼承復用和合成復用兩種,繼承復用雖然有簡單和易實現的優點,但它也存在以下缺點。
采用組合或聚合復用時,可以將已有對象納入新對象中,使之成為新對象的一部分,新對象可以調用已有對象的功能,它有以下優點。
合成復用原則的實現方法:
合成復用原則是通過將已有的對象納入到新對象中,作為新對象的成員對象來實現的,新對象可以調用已有對象的功能,從而達到復用。
總結:
這 7 種設計原則是軟件設計模式必須盡量遵循的原則,各種原則要求的側重點不同。其中,
開閉原則是總綱,它告訴我們要對擴展開放,對修改關閉;
里氏替換原則告訴我們不要破壞繼承體系;
依賴倒置原則告訴我們要面向接口編程;
單一職責原則告訴我們實現類要職責單一;
接口隔離原則告訴我們在設計接口的時候要精簡單一;
迪米特法則告訴我們要降低耦合度;
合成復用原則告訴我們要優先使用組合或者聚合關系復用,少用繼承關系復用。
轉載自 http://c.biancheng.net/view/1333.html
總結
- 上一篇: redis集群学习一些记录
- 下一篇: 饱和气压与温度的关系_不同温度下空气中饱