開閉原則 學習筆記

2021-10-10 21:48:36 字數 2605 閱讀 8375

開閉原則

軟體物件(類、模組、方法等)應該對於擴充套件是開放的,對修改是關閉的。比如:乙個網路模組,原來只有服務端功能,而現在要加入客戶端功能,那麼應當在不用修改服務端功能**的前提下,就能夠增加客戶端功能的實現**,這要求在設計之初,就應當將客戶端和服務端分開。公共部分抽象出來。

問題由來:

在軟體的生命週期內,因為變化、公升級和維護等原因需要對軟體原有**進行修改時,可能會給舊**中引入錯誤,也可能會使我們不得不對整個功能進行重構,並且需要原有**經過重新測試。

解決辦法:

當軟體需要變化時,盡量通過擴充套件軟體實體的行為來實現變化,而不是通過修改已有的**來實現變化。

開閉原則是物件導向設計中最基礎的設計原則,它指導我們如何建立穩定靈活的系統。開閉原則可能是設計模式六項原則中定義最模糊的乙個了,它只告訴我們對擴充套件開放,對修改關閉,可是到底如何才能做到對擴充套件開放,對修改關閉,並沒有明確的告訴我們。以前,如果有人告訴我"你進行設計的時候一定要遵守開閉原則",我會覺的他什麼都沒說,但貌似又什麼都說了。因為開閉原則真的太虛了。

在仔細思考以及仔細閱讀很多設計模式的文章後,終於對開閉原則有了一點認識。其實,我們遵循設計模式前面5大原則,以及使用23種設計模式的目的就是遵循開閉原則。也就是說,只要我們對前面5項原則遵守的好了,設計出的軟體自然是符合開閉原則的,這個開閉原則更像是前面五項原則遵守程度的"平均得分",前面5項原則遵守的好,平均分自然就高,說明軟體設計開閉原則遵守的好;如果前面5項原則遵守的不好,則說明開閉原則遵守的不好。

其實筆者認為,開閉原則無非就是想表達這樣一層意思:用抽象構建框架,用實現擴充套件細節。因為抽象靈活性好,適應性廣,只要抽象的合理,可以基本保持軟體架構的穩定。而軟體中易變的細節,我們用從抽象派生的實現類來進行擴充套件,當軟體需要發生變化時,我們只需要根據需求重新派生乙個實現類來擴充套件就可以了。當然前提是我們的抽象要合理,要對需求的變更有前瞻性和預見性才行。

說到這裡,再回想一下前面說的5項原則,恰恰是告訴我們用抽象構建框架,用實現擴充套件細節的注意事項而已:單一職責原則告訴我們實現類要職責單一;黎克特制替換原則告訴我們不要破壞繼承體系;依賴倒置原則告訴我們要面向介面程式設計;介面隔離原則告訴我們在設計介面的時候要精簡單一;迪公尺特法則告訴我們要降低耦合。而開閉原則是總綱,他告訴我們要對擴充套件開放,對修改關閉。

為什麼使用開閉原則?

1、只要是物件導向的程式設計,在開發過程中都會強調開閉原則

2、是最基礎的設計原則,其他五個設計原則都是開閉原則的具體形態

3、可以提高**的復用性

4、可以提高**的可維護性

如何使用開閉原則?

1、抽象約束

抽象對一組事物的通用描述,沒有具體的實現,也就表示它可以有非常多的可能性,可以跟隨需求的變化而變化。因此,通過介面或抽象類可以約束一組可能變化的行為,並且能夠實現對擴充套件開放。

2、元資料控制項模組行為

3、制定專案章程

4、封裝變化

將相同的變化封裝到乙個介面或抽象類中,將不同的變化封裝到不同的介面或抽象類中,不應該有兩個不同變化出現在同乙個介面或抽象類中。

案例:乙個工廠生產寶馬和奧迪兩種品牌的車

1 internal class

program29

}1011 internal inte***ce

iautomobile

1214

15 internal class

audi

: iautomobile

1621}22

23 internal class

bmw: iautomobile

2429}30

31 internal class

automobilefactory

3237

38public iautomobile createauto

(autotype cartype)

3948

return null;49}

50}view code

隨著業務不斷擴充套件,需要生產賓利,怎麼辦?對原有工廠進行改造使其滿足生產賓利的條件?對開閉原則來說,這顯然不合適。於是有

1 internal class

program210

}1112 internal inte***ce

iautomobile

1315

16 internal class

audi

: iautomobile

1722}23

24 internal class

bmw: iautomobile

2530}31

32 internal inte***ce

iautomobilefactory

3336

37 internal class

audifactory

: iautomobilefactory

3843}44

45 internal class

bmwfactory

: iautomobilefactory

4651

}view code

設計模式學習筆記六 開閉原則

一 介紹 1 在物件導向程式設計領域中,開閉原則規定 軟體中的物件 類,模組,函式等等 應該對於擴充套件是開放的,但是對於修改是封閉的 這意味著乙個實體是允許在不改變它的源 的前提下變更它的行為。該特性在產品化的環境中是特別有價值的,在這種環境中,改變源 需要 審查,單元測試以及諸如此類的用以確保產...

設計原則 開閉原則

開閉原則的含義是對擴充套件開放,對修改關閉。意思就是在遇到新的需求或者變動的時候,提倡對原 擴充套件使其滿足新的需求,不提倡修改原 來達到目的。乙個專案不可能在開發完畢後就一成不變了,它總會有新的需求或者對老的需求進行更新。這樣就要盡可能的遵從設計原則中的開閉原則,這個原則告訴我們,要盡量避免對原 ...

設計原則 開閉原則

怎樣的 改動才能被定義為 擴充套件 怎樣的 改動才定義為 修改 怎樣才算滿足或者違反開閉原則?修改 意味著違反開閉原則嗎?開閉原則是最難理解,也是最難掌握,同時也是最有用的一條原則。這條原則並不是看幾篇文章,理解了其概念就能掌握和靈活應用的。要想深入理解,掌握這條原則,需要大量的實戰。開閉原則,英文...