OCP開放封閉原則

2021-09-06 19:11:23 字數 1389 閱讀 4960

軟體實體(類、模組、函式等)應該是可以擴充套件的,但是不可修改。

如果正確的應用了ocp原則,那麼 以後在進行同樣的改動時,就只需要新增新的**,不必修改已經正常執行的**。

1.對於擴充套件是開放的

這意味著模組的行為是可以擴充套件的。當應用的需求改變時,我們可以對模組進行擴充套件,使其具有滿足那些改變的新行為。換句話說,我們可以改變模組的功能。

2.對於修改是封閉的

對模組進行擴充套件時,不必改動模組的源**或者二進位制**。

3.有何問題

這兩個特徵好像是互相矛盾的。擴充套件模組行為的通常方式就是修改該模組的源**。不允許修改模組常常都認為具有固定的行為。

4.如何實現?(抽象)

怎麼可能在不改動源**的情況下去更改它的行為呢?如果不更改乙個模組,又怎麼能夠去改變它的功能呢?

答案是抽象。在c#中,可以建立出固定卻能夠描述一組任意個可能行為的抽象體。這個抽象體就是抽象基類。而這一組任意個可能的行為則表現為可能的派生類。

模組可能對抽象體進行操作。由於模組依賴於乙個固定的抽象體,所以它對於更改可以是封閉的。同時,通過從這個抽象體派生,可以擴充套件此模組的行為。

下圖展示了乙個簡單的不遵循ocp的設計。client類和server類都是具體類。client類使用server類,如果我們希望client物件使用另乙個不同的伺服器物件,那麼就必須要把client類中使用server類的地方更改為新的伺服器類。

下圖則使用strategy模式(策略模式)展示了乙個針對上述問題的遵循ocp的設計。

下圖展示了另乙個使用template method模式(模版方法模式)的結構。

和圖2中client類的函式類似,policy類具有一組實現了某個策略的具體公共函式。和前面一樣,這些策略函式根據一些抽象介面描繪了要完成的功能,不同的是,在這個結構中,這些抽象介面是policy類本身的一部分。在c#中,它們是抽象方法。這些函式在policy類子型別中實現。這樣,可以通過從policy類派生出新類的方式,對policy中指定的行為進行擴充套件。

在很多方面,ocp都是物件導向設計的核心所在。遵循這個原則可以帶來物件導向技術所聲稱的巨大好處:靈活性、可重用性以及可維護性。

拒絕不成熟的抽象和抽象本身一樣重要。

開放封閉原則(OCP)

開放封閉原則 軟體實體 類,模板,函式等 應該是可以擴充套件的,但是不可以修改。舉個栗子,加入我們要設計乙個系統,在專案啟動的時候我們不可能一下子把所有的需求全部考慮到。我們所需要做的就是多擴充套件,少修改!在我們最初編寫 的時候,假設變化不會發生。當變化發生的時候,我們就建立抽象來隔離以後發生的同...

開放 封閉原則(OCP)

幾乎所有的系統,都不可能一成不變,只要是需求,就一定是會變化的。如何在面對需求的變化的時候,設計的軟體可以相對容易修改,不至於新的需求一來,就把程式推到重來。怎麼樣的設計才能面對需求的改變卻可以保持相對穩定,從而使得系統可以在第乙個版本以後不斷推出新的版本。這就是ocp原則要告訴我們的東西。面對需求...

OCP開放封閉原則

軟體實體 類 模組 函式等 應該是可以擴充套件的,但是不可修改。如果正確的應用了ocp原則,那麼 以後在進行同樣的改動時,就只需要新增新的 不必修改已經正常執行的 1.對於擴充套件是開放的 這意味著模組的行為是可以擴充套件的。當應用的需求改變時,我們可以對模組進行擴充套件,使其具有滿足那些改變的新行...