1、定義
Software entities like classes,modules and functions should be open for extension but closed for modifications.(一個軟件實體如類、模塊和函數應該對擴展開放,對修改關閉。)spring
開閉原則相比前面介紹的5項原則更模糊,其只界定了咱們要達到什麼目標,而沒有告訴咱們怎麼去作。數據庫
開閉原則對擴展開放,對修改關閉,並不意味着不作任何修改,低層模塊的變動,必然要有高層模塊進行耦合,不然就是一個孤立無心義的代碼片斷。app
2、爲何要實現開閉原則
- 對測試的影響。若軟件實現開閉原則,那麼針對一個需求的擴展咱們只能修改之前的代碼,這對之前寫好的單元測試會形成影響。
- 提升複用性。全部的邏輯都是從原子邏輯組合而來的,實現開閉原則的手段之一是經過縮小邏輯粒度,抽象相同的邏輯,提升了代碼複用。
- 提升可維護性。開閉原則經過擴展的方式實現產品迭代,比修改原有代碼更容易。
- 面向對象開發的開發需求。是對象就會有變化,而開閉原則經過抽象,限制了變化邊界,是面向對象開發的開發需求。
3、如何使用開閉原則
(一) 制定抽象約束
經過接口或抽象類約束一組可能變化的行爲。函數
- 經過接口或抽象類約束擴展,對擴展進行邊界限定。
- 參數類型、引用對象儘可能使用接口或者抽象類,而不是實現類;
- 抽象層儘可能保持穩定,一旦肯定儘可能不要修改。
(二) 元數據(metadata)控制模塊行爲
所謂元數據指的是配置信息,能夠從文件中或數據庫中讀取,如springBoot的application.yml或application.propertis等等。單元測試
(三) 封裝變化
- 將相同的變化封裝到一個接口或抽象類中。
- 將不一樣的變化封裝到不一樣的接口或抽象類中。