1. 程式人生 > >java設計模式:面向對象設計的7個原則

java設計模式:面向對象設計的7個原則

ron 依賴倒置原則 步驟 計算機 適應性 抽象類 oops 關閉 sla

在軟件開發中,為了提高軟件系統的可維護性和可復用性,增加軟件的可擴展性和靈活性,程序員要盡量根據7條原則來開發程序,從而提高軟件開發效率,節約軟件開發成本和維護成本。

這7條原則分別是:開閉原則裏氏替換原則依賴倒置原則單一職責原則接口隔離原則迪米特法則合成復用原則

接下來是對這7個原則的詳細介紹。

開閉原則(OCP,Open Closed Principle)

定義

開閉原則(Open Closed Principle,OCP)由勃蘭特·梅耶(Bertrand Meyer)提出,他在 1988 年的著作《面向對象軟件構造》(Object Oriented Software Construction)中提出:軟件實體應當對擴展開放,對修改關閉(Software entities should be open for extension,but closed for modification),這就是開閉原則的經典定義。

當應用的需求發生改變時,在不修改軟件實體的源代碼或者二進制代碼的前提下,可以擴展模塊的功能,使其滿足新的需求。

這裏的軟件實體包含幾個部分:項目中劃分出的模塊、類和接口、方法。

作用

開閉原則是面向對象程序設計的終極目標,它使軟件實體擁有一定的適用性和靈活性的同時具備穩定性和延續性。

對軟件測試的影響

軟件遵循開閉原則的話,軟件測試時只需要對擴展的代碼進行測試就可以了,因為原有的測試代碼依然能夠正常運行。

可以提高代碼的可復用性

粒度越小,被服用的可能性就越大;在面向對象的程序設計中,根據原則和抽象編程可以提高代碼的可復用性。

可以提高軟件的可維護性

遵守開閉原則的軟件,其穩定性高和延續性強,從而易於擴展和維護。

實現方法

可以通過【抽象約束、封裝變化】來實現開閉原則,即通過接口或抽象類為軟件實體定義一個相對穩定的抽象層,而將相同的可變因素封裝在相同的具體實現類中。

因為抽象靈活性好,適應性廣,只要抽象得合理,可以基本保持軟件架構的穩定,而軟件中易變的細節可以從抽象派生來的實現類來進行擴展,當軟件需要發生變化的時候,只需要根據需求重新派生一個實現類來擴展就可以了。

裏氏替換原則(LSP,Liskov Subsititution Principle)

定義

裏氏替換原則(Liskov Substitution Principle,LSP)由麻省理工學院計算機科學實驗室的裏斯科夫(Liskov)女士在 1987 年的“面向對象技術的高峰會議”(OOPSLA)上發表的一篇文章《數據抽象和層次》(Data Abstraction and Hierarchy)裏提出來的,她提出:繼承必須確保超類所擁有的性質在子類中仍然成立(Inheritance should ensure that any property proved about supertype objects also holds for subtype objects)。

裏氏替換原則主要闡述了有關繼承的一些原則,也就是什麽時候應該使用繼承,什麽時候不應該使用繼承,以及其中蘊含的原理。裏氏替換原則是繼承復用的基礎,它反映了基類與子類之間的關系,是對開閉原則的補充,是對實現抽象化的具體步驟的規範。

作用

裏氏替換原則是實現開閉原則的重要方式之一。

裏氏替換原則克服了繼承中重寫父類造成的可復用性變差的缺點。

裏氏替換原則是動作正確性的保證。即類的擴展不會給已有的系統引入新的錯誤,降低了代碼出錯的可能性。

實現方法

裏氏替換原則通俗地來講就是:子類可以擴展父類的功能,但不能改變父類原有的功能。也就是說,子類繼承父類時,除了添加新的方法完成新增功能外,盡量不要重寫父類的方法。

如果通過重寫父類的方法來完成新的功能,這樣寫起來雖然簡單,但是整個繼承體系的可復用性會比較差,特別是運用多態比較頻繁時,程序運行出錯的概率會非常大。

如果程序違背了裏氏替換原則,則繼承類的對象在基類出現的地方會出現運行錯誤。這時其修正方法是:取消原來的繼承關系,重新設計它們之間的關系。

關於裏氏替換原則的例子,最有名的是【正方形不是長方形】。當然,生活中也有很多類似的例子,例如,企鵝、鴕鳥和幾維鳥從升敘血的角度來劃分,它們屬於鳥類,但是從類的繼承關系來看,由於它們不能繼承鳥類會飛的功能,所以它們不能定義成鳥類的子類。同樣的,由於氣球魚不會遊泳,也不能夠被定義成會遊泳的魚類的子類。

java設計模式:面向對象設計的7個原則