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