定義:乙個軟體實體(類、模組或函式)應當對擴充套件開放,對修改關閉。也就是說軟體實體應盡量在不修改原有**的情況下進行擴充套件。
問題:在軟體的生命週期內,因為變化、公升級和維護等原因需要對軟體原有**進行修改時,可能會給舊**中引入錯誤,
也可能會使我們不得不對整個功能進行重構,並且需要重新測試。
方案:當軟體需要變化時,盡量通過擴充套件軟體實體的行為來實現變化,而不是通過修改已有的**來實現變化。
舉個栗子:這是乙個包工頭和工人的故事。。。
情況一:包工頭給工人命名編號。具體實現方式如下:
1. 新建乙個工人介面iworker,包含乙個工人編號的方法。**如下:
2. 新建乙個工人類worker,來實現上面的iworker介面方法。**如下:3. 新建乙個包工頭類manager,包含乙個給工人命名編號的方法,依賴iworker介面。**如下:4. 在類ocpfragment中使用worker物件呼叫命名編號的方法來實現功能。**如下:5. 執行後的效果,如下:以上的實現方式,成功完成了給工人命名編號的方法。現在我們要新增乙個給工人分配角色和任務的功能,如果在現有**的基礎上作修改的話,比如在iworker介面新增工人角色role()和工人任務doing()兩個方法,在工人類worker中去實現,修改包工頭類manager中的nameworker()方法,這樣做,如果多處呼叫了nameworker()方法的話,很可能會造成原有功能發生故障,所以這時我們必須遵守開閉原則,對修改關閉、對擴充套件開發,不去修改原有的nameworker()方法,而是去新增乙個專門用於給工人分配角色和任務的方法,這樣不僅不會影響到原有的功能,還提高了**的復用性,更加靈活。情況二:包工頭給工人命名編號,給工人分配角色和任務。遵守開閉原則,具體實現方式如下:
1. 在iworker介面中新增工人角色role()和工人任務doing()兩個方法。**如下:
2. 工人類worker需要去實現新增的兩個方法。**如下:3. 在包工頭類manager中新增乙個給工人分配角色和任務的方法,依然依賴iworker介面。**如下:4. 在類ocpfragment中仍使用worker物件去呼叫allocatetask()方法來實現功能。**如下:5. 執行後的效果,如下:綜上所述,如果乙個軟體系統符合開閉原則,那麼從軟體工程的角度來看,它將具有可復用性好和可維護性好兩大特點。開閉原則是物件導向設計中「可復用設計」的基石,是物件導向設計中最重要的原則之一。原則:1. 通過介面或抽象類約束擴充套件,對擴充套件進行邊界限定;
2. 引數型別、引用物件盡量使用介面或者抽象類,而不是實現類;
3. 抽象層盡量保持穩定,一旦確定就不允許修改;
4. 將相同的變化封裝在乙個介面或抽象類中;
5. 將不同的變化封裝到不同的介面或抽象類中。
總結:1. 單一職責原則要求實現類要職責單一;
2. 黎克特制替換原則要求不要去破壞繼承系統;
3. 依賴倒置原則要求面向介面程式設計;
4. 介面隔離原則要求在設計介面的時候要精簡單一;
5. 迪公尺特法則要求要降低耦合;
6. 開閉原則是總綱,要求對擴充套件開發,對修改關閉。
設計模式原則之開閉原則
定義 乙個軟體實體如類 模組和函式應該對擴充套件開放,對修改關閉。問題由來 在軟體的生命週期內,因為變化 公升級和維護等原因需要對軟體原有 進行修改時,可能會給舊 中引入錯誤,也可能會使我們不得不對整個功能進行重構,並且需要原有 經過重新測試。解決方案 當軟體需要變化時,盡量通過擴充套件軟體實體的行...
設計模式原則之開閉原則
對擴充套件開放,對修改關閉。軟體功能擴充套件變化 用抽象構建框架,用實現擴充套件細節。程式設計中,遵循其它原則以及使用設計模式的目的就是遵循開閉則。程式設計中最基礎,最重要的設計原則。傳介面 public class kaibiyuanze 圖形基類 class shape 設定圖形為矩形的類 cl...
設計原則 開閉原則
開閉原則的含義是對擴充套件開放,對修改關閉。意思就是在遇到新的需求或者變動的時候,提倡對原 擴充套件使其滿足新的需求,不提倡修改原 來達到目的。乙個專案不可能在開發完畢後就一成不變了,它總會有新的需求或者對老的需求進行更新。這樣就要盡可能的遵從設計原則中的開閉原則,這個原則告訴我們,要盡量避免對原 ...