Java設(shè)計模式(二)六大原則

文/大大大大峰哥

概述

在Java設(shè)計模式中,我們通常在設(shè)計上面需要遵循六大原則

單一職責原則

單一職責原則的定義

單一職責原則是一個類,引起它變化的原因只有一個.

該原則提出的是一個理想期望,任務(wù)對象不應(yīng)該承擔太多的職責,實現(xiàn)專注,才能保證對象的高內(nèi)聚;單一性則可以保住對象的細粒度.高內(nèi)聚與細粒度有利于對象的重用.當一個類承擔了太多的職責,會造成冗余代碼.

注意:單一職責原則不是只要求我們?yōu)轭惗x一個職責,而是提醒我們在一個類中盡量讓類負載少的職責,從而保證對象具有高內(nèi)聚與細粒度.

有時候我們在寫項目的時候,比如是一個自行車的類,我們按照自行車一般的屬性方法將這個類完善完畢,之后我們又有一個需求就是這個自行車具有某某特殊屬性或者方法的自行車.這個時候在我們沒有學習Java設(shè)計模式之前,我們會將這個特殊屬性或者方法直接寫入自行車類中.但是這個單一職責原則下,我們可以選擇重新創(chuàng)造一個類(負責擴展原有自行車功能),這樣就不會改變原有的類.這樣有什么好處:

  • 降低類的復雜度
  • 提高類的可讀性
  • 提高代碼的可維護性和復用性
  • 降低因變更而引起的風險

單一職責原則的應(yīng)用

在我們學習JavaEE的時候,JavaEE中的分層框架就體現(xiàn)了這個原則,將整個系統(tǒng)安裝職責的內(nèi)聚分為不同的層,每一層有一個主要的功能,關(guān)注事物一致.

Java EE框架

Presentation:表現(xiàn)層

Business:業(yè)務(wù)層

persistence: 持久層

Database:數(shù)據(jù)層

用我現(xiàn)在在寫的項目來舉例,Dao包中的類就是處理一些業(yè)務(wù)邏輯,DB包中就是一些數(shù)據(jù)庫的增刪改查.

里氏替換原則

大家不要看這個名字拗口,這個其實就是教我如何正確使用繼承的.

里氏替換原則定義

如果對一個類型為S的對象o1,都有類型為T的對象o2,以S定義的所有程序P中所有的對象o1都替換成o2時,程序P行為沒有發(fā)生變化,那么類型T是類型S的子類型.

打完上面的字我內(nèi)心都是掙扎的,我感覺會有讀者大聲的說能不能說人話…其實這個里氏替換原則就是告訴我們什么是繼承,如果你知道什么是繼承,就可以直接跳過上面那段話...

注意:子類不能更改父類的訪問權(quán)限

依賴倒置原則

依賴倒置原則的定義

  • 高層模塊不應(yīng)該依賴底層模型,兩者都依賴其抽象
  • 抽象不依賴細節(jié)
  • 細節(jié)應(yīng)該依賴抽象

我翻譯翻譯…抽象類指抽象類與接口.細節(jié)指已實現(xiàn)的類.在我們的Java項目中對該原則的表現(xiàn):

  • 模塊之間的依賴是通過抽象產(chǎn)生,實現(xiàn)類之間不發(fā)生直接的依賴關(guān)系.
  • 接口或者抽象類不依賴實現(xiàn)類,實現(xiàn)類依賴于接口或者抽象類.

這個原則也就是希望我們大量使用接口和抽象類,也可以理解成"面向接口編程OOD".依賴倒置原則可以減少類間的耦合性,提高系統(tǒng)穩(wěn)定,降低并行開發(fā)引起的風險,提高可讀性和可維護性.

依賴倒置原則的應(yīng)用

上圖只有IDriver與ICar之間存在依賴關(guān)系,而實現(xiàn)類中都沒有直接關(guān)系,這就是依賴倒置原則的應(yīng)用.

使用這個原則需要遵循幾個規(guī)則:

  • 每個類應(yīng)該都具有接口或抽象類,或者同時具備抽象類和接口.
  • 變量的表面類型盡量是接口或者是抽象類
  • 任何類都不應(yīng)該從具體類派生
  • 盡量不應(yīng)該重寫基類的方法
  • 結(jié)合里氏替換原則使用

依賴倒置原則是六中設(shè)計原則中最難以實現(xiàn)的原則,它是實現(xiàn)開閉原則的重要途徑.在項目中抓住"面向接口編程"的思想就基本抓住了依賴倒置的原則

接口隔離原則

這里先理解什么是接口.接口分為兩種:

  • 實例接口:Person 張三=new Person(),在這里的張三就是Person的實例接口
  • 類接口:在我們使用多線程的時候,大家肯定發(fā)現(xiàn)有一個接口叫做java.lang.Runnable這個就是一個類接口.

接口隔離原則的定義

  1. 客戶端不應(yīng)該依賴它不需要的接口.
  2. 類間的依賴關(guān)系應(yīng)該建立在最小的接口上.

接口相當于一個角色,我們不應(yīng)該將不同的角色都交給一個接口.同時不應(yīng)該強迫客戶依賴于他們不用的方法,這一點十分重要.

在我們?nèi)粘>幋a的過程中一個類,往往會有不同性質(zhì)的對象,比如一個汽車,可能有奔馳,寶馬,凱德拉克,特使拉等等,這些不同的車有一些不同的特性,對待這些不同的特性我們應(yīng)該對應(yīng)每一個不同的品牌寫不同的接口.

接口隔離原則的應(yīng)用

上面的應(yīng)用實踐可以看出一個接口只對一個子模塊或者業(yè)務(wù)邏輯進行服務(wù).這里還要提醒接口不是越小越好,接口太小則會導致接口數(shù)量劇增,給開發(fā)帶來難度;如果接口太大,靈活性降低,將無法提供定制服務(wù),給項目帶來無法預計的風險.

迪米特法則

迪米特法則的定義

國外的定義往往通常是以發(fā)現(xiàn)者的名字所取名的,這個法則又叫做最少只是原則,其意義是:一個對象應(yīng)當對其他對象盡可能的少的了解,其中對迪米特法則最具有代表性的幾種表述如下:

  • 只同你直接的朋友們通信
  • 不要跟陌生人說話
  • 每一個軟件單位對其他的單位都只有最少的了解,這些了解僅局限于那些與本單位密切相關(guān)的軟件單位

其實意義就是兩個類之間的聯(lián)系是通過一個朋友類相互關(guān)聯(lián),這樣可以減少類之間的關(guān)系,降低類之間的耦合,提高類的復用率.

迪米特法則的應(yīng)用

我通過call方法傳遞進我的Friend,然后同F(xiàn)riend中的變量Stranger,我可以間接訪問Stranger中方法,這樣Friend就是一個類似介質(zhì)的功能.

這里我對這個法則的感悟不是很深,暫時先記住,以后在后續(xù)的開發(fā)過程中可能可以找到這個法則的應(yīng)用場景,和一些優(yōu)點.

開閉原則

開閉原則的定義

一個軟件應(yīng)當對擴展開放,對修改關(guān)閉.

在設(shè)計一個模塊的時候,應(yīng)當使用這個模塊可以在不被修改的前提下被擴展.面向?qū)ο缶幊讨?開閉原則是最基本的原則,其他五大原則(單一職責,迪米特原則,里氏替換原則,依賴倒置原則,接口隔離原則)這些都是開閉原則的具體形態(tài),以及是開閉原則的手段和工具.開閉原則一般可以通過以下幾個方面體現(xiàn):

  • 開閉原則提高復用性
  • 開閉原則提高可維護性
  • 開閉原則提高靈活性
  • 開閉原則有利測試

開閉原則的應(yīng)用

上圖是一個書店商品正常情況下的類.因為商店的促銷需要來一個打折,所以在之前類通過繼承的方式解決了這個問題.

這個就是開閉原則的體現(xiàn)對擴展開放,對修改關(guān)閉,我沒有修改之前的代碼,同時實現(xiàn)了功能的擴展,這是面向?qū)ο缶幊讨兄陵P(guān)重要的.

開閉原則解決問題的關(guān)鍵在與抽象化.把所有可能的行為抽象為抽象底層,這個抽象底層規(guī)定了所有的具體實現(xiàn)必須提供的方法的特征,給系統(tǒng)定義一個一勞永逸的抽象設(shè)計,設(shè)計允許有無窮盡的行為在實現(xiàn)層被實現(xiàn).

在抽象層一定要竟可能的預見所有可能的擴展,在任何擴展情況下的系統(tǒng)的抽象底層不需修改,從而滿足開閉原則的第二條(對修改關(guān)閉).通過從抽象層導出一個或多個新的具體類改變系統(tǒng)的行為,通過使用新的行為來擴展,從而滿足開閉原則的第一條(可以擴展).

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,321評論 6 543
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,559評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,442評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,835評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,581評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,922評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,931評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,096評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,639評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,374評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,591評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,104評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,789評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,196評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,524評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,322評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,554評論 2 379

推薦閱讀更多精彩內(nèi)容