java面向對象設計原則之開閉原則示例解析
概念
唯一不變的是不斷的變化,在軟件開發(fā)中應該對需求的變化持開放態(tài)度,我們要做的就是如何將這種變化對我們現(xiàn)有的成果帶來最小的沖擊。開閉原則直接面對面向對象程序的目標擴展性和可維護性,要求對擴展開放,對修改關閉;即在不修改原有代碼的情況下改變模塊的行為。該原則是面向對象程序設計的總原則,也是度量程序設計的好與壞的唯一標準
實現(xiàn)
開閉原則的實現(xiàn)策略主要在面向對象的封裝性和多態(tài)性的基礎上,利用面向對象的其他原則完成的。
1.使用多態(tài)機制解決問題。
如:遠程監(jiān)控系統(tǒng)使用數(shù)據(jù)傳輸使用427版本的協(xié)議,一年以后對427版本的協(xié)議進行了修正。設計時應該考慮的數(shù)據(jù)傳輸協(xié)議的可變性,抽象出具有報文解譯、編制、校驗等所有版本協(xié)議使用的通用方法,調(diào)用方針對接口進行編程即可,如上述示例設計類圖如下:
調(diào)用方依賴于報文接口,報文接口是穩(wěn)定的,而不針對具體的427協(xié)議或427修正協(xié)議。利用接口多態(tài)技術,實現(xiàn)了開閉原則。除使用接口實現(xiàn)多態(tài)外,還可以使用繼承機制重置實現(xiàn)多態(tài)來完成,如:某一實現(xiàn)過程包括獲取數(shù)據(jù)、數(shù)據(jù)處理、數(shù)據(jù)存儲,其中獲取數(shù)據(jù)和存取數(shù)據(jù)不變,數(shù)據(jù)處理過程發(fā)生變化,則可以在子類中使用重置機制將數(shù)據(jù)處理方法進行重寫。使用多態(tài)技術實現(xiàn)的方式,均不修改原有代碼,只是增加一份新的實現(xiàn)類,完成了開閉原則。
2.降低耦合度, 將變化的代碼降到最低
如:系統(tǒng)界面上按鈕控件為方形按鈕,現(xiàn)在領導要求把所有的按鈕換成圓角按鈕,如何辦?
使用迪米特法則,在使用按鈕控件時,給其包外圍一層,增加一個按鈕包裝類,使得界面與按鈕控件脫耦,修改時只需修改包裝器類即可。其類圖如下:
3. 遵循單一職責原則
職責越單一,封裝性越好,“開閉原則”越容易實現(xiàn)。
拓展
1.注意分支語句的使用。分支語句破壞開閉原則,當條件發(fā)生變化時,我們不得不修改代碼。解決辦法依然是使用多態(tài)機制,每個分支使用不同實現(xiàn)類,來解決問題。
2. 避免過度設計
百分之百的開閉原則很難達到,但要盡量符合開閉原則。在設計時對于將來可能會發(fā)生變化的部分實現(xiàn)面向接口的編程,同時對不可能或極小概率發(fā)生變化時的應該避免過度設計而造成的復雜性。
以上就是java面向對象設計原則之開閉原則示例解析的詳細內(nèi)容,更多關于java面向對象設計原則的資料請關注腳本之家其它相關文章!
相關文章
SpringBoot如何讀取配置文件中的數(shù)據(jù)到map和list
這篇文章主要介紹了SpringBoot如何讀取配置文件中的數(shù)據(jù)到map和list,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02mybatisplus where QueryWrapper加括號嵌套查詢方式
這篇文章主要介紹了mybatisplus where QueryWrapper加括號嵌套查詢方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教。2022-01-01spring boot @ResponseBody轉換JSON 時 Date 類型處理方法【兩種方法】
這篇文章主要介紹了spring boot @ResponseBody轉換JSON 時 Date 類型處理方法,主要給大家介紹Jackson和FastJson兩種方式,每一種方法給大家介紹的都非常詳細,需要的朋友可以參考下2018-08-08Spring配置多個數(shù)據(jù)源并實現(xiàn)數(shù)據(jù)源的動態(tài)切換功能
這篇文章主要介紹了Spring配置多個數(shù)據(jù)源并實現(xiàn)數(shù)據(jù)源的動態(tài)切換功能,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-01-01@RequestParam?和@RequestBody注解的區(qū)別解析
在 Spring MVC 中,我們可以使用 @RequestParam 和 @RequestBody 來獲取請求參數(shù),但它們在用法和作用上有一些區(qū)別,這篇文章主要介紹了@RequestParam?和@RequestBody注解的區(qū)別,需要的朋友可以參考下2023-06-06