簡介:
開閉原則(ocp)是物件導向設計中「可復用設計」的基石,是物件導向設計中最重要的原則之一,其它很多的設計原則都是實現開閉原則的一種手段。對於擴充套件是開放的,對於修改是關閉的,這意味著模組的行為是可以擴充套件的。當應用的需求改變時,我們可以對模組進行擴充套件,使其具有滿足那些改變的新行為。也就是說,我們可以改變模組的功能。對模組行為進行擴充套件時,不必改動模組的源**或者二進位制**。模組的二進位制可執行版本,無論是可鏈結的庫、dll或者.exe檔案,都無需改動。
軟體實體包括:
專案或軟體產品中按照一定的邏輯規則劃分的模組
抽象和類
方法下面通過例項來詳細了解一下:
現在有個書店售書的場景,首先定義乙個ibook類,裡面有兩個屬性:名稱、**。
public
inte***ce ibook
定義**類novelbook-實現類
public
class
novelbook
implements
ibook
public string getname()
public
intgetprice() }
下面是client類
public
class client}
下面有個需求需要更改,」如果書籍的**在50以上,就打九折**」 對於這樣的需求變化,下面有三種方法可以解決:
1.修改介面
在ibook介面中新增乙個getdisprice(),專門用來打折處理,實現類重新實現該介面。這樣的修改noverlbook和client都要修改,而且介面本身就要求穩定,不能隨意修改,所以這個方法不可取。
2.修改實現類
修改noverlbook類中的方法,直接在房裡加入打折的邏輯,但是有個問題,別人很難知道此書是否被打折了,而且寫在這裡容易造成**對不上等錯誤,所以此方法不可取。
3.擴充套件實現變化
新增乙個子類disnoverlbook類,並覆寫getprice()方法,產生新的物件,修改的**很少,影響也小。下面是disnoverlbook類具體**:
public
class
disnovelbook
implements
novelbook
//覆寫**方法,當**大於50,就打9析
public
intgetprice()else
} }
在client中只要修改一下實現類物件就可以了:
public
class client }
開閉原則對擴充套件開放,對修改關閉,並不意味著不做任何的修改,底層模組的變更,必然有高層模組進行耦合。
二.如何使用開閉原則
抽象約束
通過介面或者抽象類約束擴充套件,對擴充套件進行邊界限定,不允許出現在介面或抽象類中不存在的public方法;
引數型別、引用物件盡量使用介面或者抽象類,而不是實現類;
抽象層盡量保持穩定,一旦確定即不允許修改。
元資料(metadata)控制模組行為
元資料就是用來描述環境和資料的資料,通俗地說就是配置引數,引數可以從檔案中獲得,也可以從資料庫中獲得。
spring容器就是乙個典型的元資料控制模組行為的例子,其中達到極致的就是控制反轉(inversion of control)
制定專案章程
在乙個團隊中,建立專案章程是非常重要的,因為章程中指定了所有人員都必須遵守的約定,對專案來說,約定優於配置。
封裝變化
三.為什麼使用開閉原則
開閉原則非常有名,只要是物件導向程式設計,在開發時都會強調開閉原則
開閉原則是最基礎的設計原則
開閉原則可以提高復用性
開閉原則可以提高維護性
物件導向開發的要求
六大設計原則詳解(1)-單一職責原則
六大設計原則詳解(2)-黎克特制替換原則
六大設計原則詳解(3)-依賴倒置原則
六大設計原則詳解(4)-介面隔離原則
六大設計原則詳解(5)-迪公尺特法則
設計模式六大原則(6) 開閉原則
定義 乙個軟體實體如類 模組和函式應該對擴充套件開放,對修改關閉。問題由來 在軟體的生命週期內,因為變化 公升級和維護等原因需要對軟體原有 進行修改時,可能會給舊 中引入錯誤,也可能會使我們不得不對整個功能進行重構,並且需要原有 經過重新測試。解決方案 當軟體需要變化時,盡量通過擴充套件軟體實體的行...
設計模式六大原則(6) 開閉原則
定義 乙個軟體實體如類 模組和函式應該對擴充套件開放,對修改關閉。問題由來 在軟體的生命週期內,因為變化 公升級和維護等原因需要對軟體原有 進行修改時,可能會給舊 中引入錯誤,也可能會使我們不得不對整個功能進行重構,並且需要原有 經過重新測試。解決方案 當軟體需要變化時,盡量通過擴充套件軟體實體的行...
設計模式六大原則(6) 開閉原則
摘自 分類 設計模式2012 02 27 08 48 26188人閱讀 舉報 設計模式 擴充套件框架 程式設計測試 定義 乙個軟體實體如類 模組和函式應該對擴充套件開放,對修改關閉。問題由來 在軟體的生命週期內,因為變化 公升級和維護等原因需要對軟體原有 進行修改時,可能會給舊 中引入錯誤,也可能會...