簡(jiǎn)單粗暴,Java設(shè)計(jì)模式六大原則的理解

六大原則

  • 單一職責(zé)原則

  • 里氏替換原則

  • 依賴倒置原則

  • 接口隔離原則

  • 迪米特原則

  • 開(kāi)閉原則

單一職責(zé)

  • 概念:對(duì)功能進(jìn)行分類,代碼進(jìn)行解耦

  • 栗子:一個(gè)網(wǎng)絡(luò)請(qǐng)求框架大致分為:請(qǐng)求類,緩存類,配置類;不能把這三個(gè)功能混合在一起,必須分成三個(gè)類分別去實(shí)現(xiàn)不同的功能

里氏替換

  • 概念:在繼承類時(shí),除了擴(kuò)展一些新的功能之外,盡量不要?jiǎng)h除或者修改對(duì)父類方法的引用,也盡量不要重載父類的方法

  • 栗子:每個(gè)類都是Object的子類,Object類中有一個(gè)toString()的方法,假如子類重寫該方法并且返回null,這個(gè)子類的下一級(jí)繼承返回的都是null,那么在不同開(kāi)發(fā)人員維護(hù)時(shí)可能考慮不到這個(gè)問(wèn)題,并且很可能會(huì)導(dǎo)致程序崩潰

依賴倒置

  • 概念:高層模塊不依賴低層次模塊的細(xì)節(jié),高層次就是不依賴細(xì)節(jié)而是依賴抽象(不依賴具體的類,而是依賴于接口)

  • 栗子:某個(gè)網(wǎng)絡(luò)框架為了滿足不同開(kāi)發(fā)者的需求,即能使用高效的OkHttp框架,也可以使用原生的API。正所謂蘿卜白菜各有所愛(ài),那么是如何進(jìn)行切換的呢,這個(gè)時(shí)候需要面向接口編程思想了,把一些網(wǎng)絡(luò)請(qǐng)求的方法封裝成一個(gè)接口,然后分別創(chuàng)建OkHttp和原生API的接口實(shí)現(xiàn)類,當(dāng)然也方便后續(xù)其他開(kāi)發(fā)人員進(jìn)行擴(kuò)展其他網(wǎng)絡(luò)框架的應(yīng)用

接口隔離

  • 概念:在定義接口方法時(shí)應(yīng)該合理化,盡量追求簡(jiǎn)單最小,避免接口臃腫

  • 栗子:在實(shí)際開(kāi)發(fā)中,往往為了節(jié)省時(shí)間,可能會(huì)將多個(gè)功能的方法抽成一個(gè)接口,其實(shí)這設(shè)計(jì)理念不正確的,這樣會(huì)使接口處于臃腫的狀態(tài),這時(shí)就需要合理的拆分接口中的方法,另外抽取成一個(gè)獨(dú)立的接口,避免原有的接口臃腫導(dǎo)致代碼理解困難

迪米特 | 最少知道

  • 概念:一個(gè)對(duì)象應(yīng)該對(duì)其他對(duì)象有最少的了解;一個(gè)類應(yīng)該對(duì)自己需要耦合或調(diào)用的類知道得最少,類的內(nèi)部如何實(shí)現(xiàn)、如何復(fù)雜都與調(diào)用者或者依賴者沒(méi)關(guān)系,調(diào)用者或者依賴者只需要知道他需要的方法即可,其他的一概不關(guān)心。類與類之間的關(guān)系越密切,耦合度越大,當(dāng)一個(gè)類發(fā)生改變時(shí),對(duì)另一個(gè)類的影響也越大。只與直接的朋友通信。每個(gè)對(duì)象都必然會(huì)與其他對(duì)象有耦合關(guān)系,兩個(gè)對(duì)象之間的耦合就成為朋友關(guān)系,這種關(guān)系的類型有很多,例如組合、聚合、依賴等。

  • 栗子:一般在使用框架的時(shí)候,框架的開(kāi)發(fā)者會(huì)抽出一個(gè)類供外部調(diào)用,而這個(gè)主要的類像是一個(gè)中介一樣去調(diào)用框架里面的其他類,恰恰框架里面其他類一般都是不可訪問(wèn)(調(diào)用)的,這個(gè)框架就遵守了迪米特原則,其他開(kāi)發(fā)人員只關(guān)心調(diào)用的方法,并不需要關(guān)心功能具體如何實(shí)現(xiàn)

開(kāi)閉

  • 概念:類、模塊和函數(shù)應(yīng)該對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉

  • 栗子:在軟件的生命周期內(nèi),因?yàn)樽兓?、升?jí)和維護(hù)等原因需要對(duì)軟件原有代碼進(jìn)行修改時(shí),可能會(huì)給舊代碼中引入錯(cuò)誤,也可能會(huì)使我們不得不對(duì)整個(gè)功能進(jìn)行重構(gòu),并且需要原有代碼經(jīng)過(guò)重新測(cè)試,整個(gè)流程對(duì)開(kāi)發(fā)周期影響很大,這個(gè)時(shí)候就需要開(kāi)閉原則來(lái)解決這種問(wèn)題,在前期代碼設(shè)計(jì)的時(shí)候,要盡量考慮擴(kuò)展性,避免后續(xù)新增功能的時(shí)候需要引發(fā)代碼的重構(gòu)

總結(jié)

  • 單一職責(zé)原則告訴我們實(shí)現(xiàn)類要職責(zé)單一

  • 里氏替換原則告訴我們不要破壞繼承體系

  • 依賴倒置原則告訴我們要面向接口編程

  • 接口隔離原則告訴我們?cè)谠O(shè)計(jì)接口的時(shí)候要精簡(jiǎn)單一

  • 迪米特原則告訴我們要降低耦合

  • 開(kāi)閉原則是總綱,告訴我們要對(duì)擴(kuò)展開(kāi)放,對(duì)修改關(guān)閉

精品文章

設(shè)計(jì)模式六大原則

面向?qū)ο罅蠡驹瓌t - 網(wǎng)絡(luò)引擎切換

如果不夠準(zhǔn)確,請(qǐng)幫忙指出

這篇文章要是對(duì)你有幫助的話,記得點(diǎn)個(gè)贊

Android 技術(shù)討論 Q 群:10047167

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容