設(shè)計(jì)模式(Design Pattern)

一拓提、簡(jiǎn)述

設(shè)計(jì)模式是一套被反復(fù)使用、多數(shù)人知曉的隧膘、經(jīng)過(guò)分類的代态、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。使用設(shè)計(jì)模式的目的:為了代碼可重用疹吃、讓代碼更容易被理解蹦疑、保證代碼可靠性。 設(shè)計(jì)模式使代碼編寫(xiě)真正工程化萨驶,是軟件工程的基石脈絡(luò)歉摧,如同大廈的結(jié)構(gòu)一樣。

Java 中有 23 種設(shè)計(jì)模式篡撵,總體來(lái)說(shuō)設(shè)計(jì)模式分為三大類:

  1. 【創(chuàng)建型模式】共 5 種:單例模式判莉、工廠方法模式、抽象工廠模式育谬、建造者模式券盅、原型模式
  2. 【結(jié)構(gòu)型模式】共7種:適配器模式膛檀、橋接模式锰镀、組合模式、裝飾模式咖刃、外觀模式泳炉、享元模式、代理模式嚎杨。
  3. 【行為型模式】共11種:訪問(wèn)者模式花鹅、模板模式、策略模式枫浙、狀態(tài)模式刨肃、觀察者模式古拴、備忘錄模式、中介者模式真友、迭代器模式黄痪、解釋器模式、命令模式盔然、責(zé)任鏈模式桅打。

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

  1. 開(kāi)閉原則(Open Close Principle)
    對(duì)擴(kuò)展開(kāi)放愈案,對(duì)修改關(guān)閉挺尾。在程序需要進(jìn)行拓展的時(shí)候,不能去修改原有的代碼刻帚,實(shí)現(xiàn)一個(gè)熱插拔的效果潦嘶。簡(jiǎn)言之,是為了使程序的擴(kuò)展性好崇众,易于維護(hù)和升級(jí)掂僵。想要達(dá)到這樣的效果,需要使用接口和抽象類顷歌。

  2. 里氏代換原則(Liskov Substitution Principle)
    面向?qū)ο笤O(shè)計(jì)的基本原則之一锰蓬。 里氏代換原則中說(shuō),任何基類可以出現(xiàn)的地方眯漩,子類一定可以出現(xiàn)芹扭。LSP 是繼承復(fù)用的基石,只有當(dāng)派生類可以替換掉基類赦抖,且軟件單位的功能不受到影響時(shí)舱卡,基類才能真正被復(fù)用,而派生類也能夠在基類的基礎(chǔ)上增加新的行為队萤。里氏代換原則是對(duì)開(kāi)閉原則的補(bǔ)充轮锥。實(shí)現(xiàn)開(kāi)閉原則的關(guān)鍵步驟就是抽象化,而基類與子類的繼承關(guān)系就是抽象化的具體實(shí)現(xiàn)要尔,所以里氏代換原則是對(duì)實(shí)現(xiàn)抽象化的具體步驟的規(guī)范舍杜。

  3. 依賴倒轉(zhuǎn)原則(Dependence Inversion Principle)
    這個(gè)原則是開(kāi)閉原則的基礎(chǔ)。具體內(nèi)容:針對(duì)接口編程赵辕,依賴于抽象而不依賴于具體既绩。

  4. 接口隔離原則(Interface Segregation Principle)
    含義:使用多個(gè)隔離的接口,比使用單個(gè)接口要好还惠。另外一個(gè)含義:降低類之間的耦合度饲握。由此可見(jiàn),其實(shí)設(shè)計(jì)模式就是從大型軟件架構(gòu)出發(fā)、便于升級(jí)和維護(hù)的軟件設(shè)計(jì)思想救欧,它強(qiáng)調(diào)降低依賴歪今,降低耦合。

  5. 迪米特法則颜矿,又稱最少知道原則(Demeter Principle)
    一個(gè)實(shí)體應(yīng)當(dāng)盡量少地與其他實(shí)體之間發(fā)生相互作用,使得系統(tǒng)功能模塊相對(duì)獨(dú)立嫉晶。

  6. 合成復(fù)用原則(Composite Reuse Principle)
    盡量使用合成/聚合的方式皂岔,而不是使用繼承兜蠕。

開(kāi)閉原則具有理想主義的色彩,它是面向?qū)ο笤O(shè)計(jì)的終極目標(biāo)。其他幾條商蕴,則可以看做是開(kāi)閉原則的實(shí)現(xiàn)方法。設(shè)計(jì)模式就是實(shí)現(xiàn)了這些原則艺晴,從而達(dá)到了代碼復(fù)用庶艾、增加可維護(hù)性的目的。

三状答、Spring 中用到的設(shè)計(jì)模式

1??代理模式:在 AOP 和 remoting 中被用的比較多冷守。

2??單例模式:在 Spring 配置文件中定義的 bean 默認(rèn)為單例模式。

3??模板模式:用來(lái)解決代碼重復(fù)的問(wèn)題惊科。比如 RestTemplate拍摇、JmsTemplate、JpaTemplate馆截。

4??委派模式:Spring 提供了 DispatcherServlet 來(lái)對(duì)請(qǐng)求進(jìn)行分發(fā)充活。

5??工廠模式:BeanFactory 用來(lái)創(chuàng)建對(duì)象的實(shí)例,貫穿于 BeanFactory/ApplicationContext 接口的核心理念蜡娶。

四混卵、JDK中常用的設(shè)計(jì)模式

1??單例模式用于 Runtime、Calendar 和其他的一些類中窖张。
2??工廠模式被用于各種不可變的類如 Boolean幕随,像 Boolean.valueOf。
3??觀察者模式被用于 swing 和很多的時(shí)間監(jiān)聽(tīng)中荤堪。
4??裝飾器模式被用于多個(gè) java IO 類合陵。

五、什么是 GOF(四人幫澄阳,全拼 Gang of Four)

在 1994 年拥知,由 Erich Gamma、Richard Helm碎赢、Ralph Johnson 和 John Vlissides 四人合著出版了一本名為 Design Patterns - Elements of Reusable Object-Oriented Software(中文譯名:設(shè)計(jì)模式 - 可復(fù)用的面向?qū)ο筌浖?的書(shū)低剔,該書(shū)首次提到了軟件開(kāi)發(fā)中設(shè)計(jì)模式的概念。四位作者合稱 GOF。他們所提出的設(shè)計(jì)模式主要是基于以下的面向?qū)ο笤O(shè)計(jì)原則:

1??對(duì)接口編程而不是對(duì)實(shí)現(xiàn)編程襟齿。
2??優(yōu)先使用對(duì)象組合而不是繼承姻锁。

六、裝飾模式(decorator design pattern)有何例子猜欺?它是作用于對(duì)象層次還是類層次位隶?

裝飾模式增強(qiáng)了單個(gè)對(duì)象的能力。Java IO 到處都使用了裝飾模式开皿,典型例子就是 Buffered 系列類如 BufferedReader 和 BufferedWriter涧黄,它們?cè)鰪?qiáng)了 Reader 和 Writer 對(duì)象,以實(shí)現(xiàn)提升性能的 Buffer 層次的讀取和寫(xiě)入赋荆。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末笋妥,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子窄潭,更是在濱河造成了極大的恐慌春宣,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件嫉你,死亡現(xiàn)場(chǎng)離奇詭異月帝,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)幽污,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門嫁赏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人油挥,你說(shuō)我怎么就攤上這事潦蝇。” “怎么了深寥?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵攘乒,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我惋鹅,道長(zhǎng)则酝,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任闰集,我火速辦了婚禮沽讹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘武鲁。我一直安慰自己爽雄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布沐鼠。 她就那樣靜靜地躺著挚瘟,像睡著了一般叹谁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上乘盖,一...
    開(kāi)封第一講書(shū)人閱讀 52,584評(píng)論 1 312
  • 那天焰檩,我揣著相機(jī)與錄音,去河邊找鬼订框。 笑死析苫,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的穿扳。 我是一名探鬼主播藤违,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼纵揍!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起议街,我...
    開(kāi)封第一講書(shū)人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤泽谨,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后特漩,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體吧雹,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年涂身,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了雄卷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蛤售,死狀恐怖丁鹉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情悴能,我是刑警寧澤揣钦,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站漠酿,受9級(jí)特大地震影響冯凹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜炒嘲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一宇姚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧夫凸,春花似錦浑劳、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春道逗,著一層夾襖步出監(jiān)牢的瞬間兵罢,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工滓窍, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留卖词,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓吏夯,卻偏偏與公主長(zhǎng)得像此蜈,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子噪生,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

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