設(shè)計模式概述

設(shè)計模式主要是基于以下的面向?qū)ο笤O(shè)計原則对嚼。

對接口編程而不是對實現(xiàn)編程机蔗。

優(yōu)先使用對象組合而不是繼承背传。

設(shè)計模式分類:

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

1剩盒、開閉原則(Open Close Principle)

開閉原則的意思是:對擴展開放谷婆,對修改關(guān)閉。在程序需要進行拓展的時候辽聊,不能去修改原有的代碼纪挎,實現(xiàn)一個熱插拔的效果。簡言之跟匆,是為了使程序的擴展性好异袄,易于維護和升級。想要達到這樣的效果玛臂,我們需要使用接口和抽象類烤蜕,后面的具體設(shè)計中我們會提到這點。

2垢揩、里氏代換原則(Liskov Substitution Principle)

里氏代換原則是面向?qū)ο笤O(shè)計的基本原則之一玖绿。 里氏代換原則中說,任何基類可以出現(xiàn)的地方叁巨,子類一定可以出現(xiàn)斑匪。LSP 是繼承復(fù)用的基石,只有當(dāng)派生類可以替換掉基類锋勺,且軟件單位的功能不受到影響時蚀瘸,基類才能真正被復(fù)用,而派生類也能夠在基類的基礎(chǔ)上增加新的行為庶橱。里氏代換原則是對開閉原則的補充贮勃。實現(xiàn)開閉原則的關(guān)鍵步驟就是抽象化,而基類與子類的繼承關(guān)系就是抽象化的具體實現(xiàn)苏章,所以里氏代換原則是對實現(xiàn)抽象化的具體步驟的規(guī)范寂嘉。

3、依賴倒轉(zhuǎn)原則(Dependence Inversion Principle)

這個原則是開閉原則的基礎(chǔ)枫绅,具體內(nèi)容:針對接口編程泉孩,依賴于抽象而不依賴于具體。

4并淋、接口隔離原則(Interface Segregation Principle)

這個原則的意思是:使用多個隔離的接口寓搬,比使用單個接口要好。它還有另外一個意思是:降低類之間的耦合度县耽。由此可見句喷,其實設(shè)計模式就是從大型軟件架構(gòu)出發(fā)镣典、便于升級和維護的軟件設(shè)計思想,它強調(diào)降低依賴唾琼,降低耦合兄春。

5、迪米特法則锡溯,又稱最少知道原則(Demeter Principle)

最少知道原則是指:一個實體應(yīng)當(dāng)盡量少地與其他實體之間發(fā)生相互作用神郊,使得系統(tǒng)功能模塊相對獨立。

6趾唱、合成復(fù)用原則(Composite Reuse Principle)

合成復(fù)用原則是指:盡量使用合成/聚合的方式涌乳,而不是使用繼承。


Factory模式

這個模式可能是是個人都知道的模式甜癞。這個模式在現(xiàn)實社會中就像各種工廠一樣夕晓,工廠跨界的不多,基本上都是在生產(chǎn)同一類的產(chǎn)品悠咱,有的生產(chǎn)汽車蒸辆,有的生產(chǎn)電視,有的生產(chǎn)衣服析既,有的生產(chǎn)衛(wèi)生紙……基本上來說躬贡,一個生產(chǎn)線上只有做同一類的東西。這和Factory模式很相似眼坏。編程中拂玻,像內(nèi)存池、線程池宰译、連接池等池化技術(shù)都是這個模式檐蚜,當(dāng)然,F(xiàn)actory給你的一個對象沿侈,而不單單只是資源闯第,factory創(chuàng)建出來的對象都有同樣的接口可以被多態(tài)調(diào)用。這其實和Unix把所有的硬件都factory成文件一樣缀拭,并提供了read/write等文件操作來讓你操作任意設(shè)備的I/O咳短。

Abstract Factory模式

抽象工廠這個模式是創(chuàng)建一組有同一主題的不同的類。這個模式在現(xiàn)實社會當(dāng)中也有很多例子蛛淋,比如:

移動公司的合約機計劃咙好,88套餐(通話100分鐘,短信100條铣鹏,彩信敷扫,20條哀蘑,上網(wǎng)200M)诚卸,128套餐(通話200分鐘,短信150條合溺,彩信50條卒密,上網(wǎng)500M)……

家里的裝修,總是要有廚衛(wèi)棠赛,有門哮奇,有燈,有沙發(fā)睛约,有茶幾鼎俘,有床,有衣柜辩涝,有電視贸伐,有冰箱,有洗衣機……怔揩,這些都是必需的捉邢,只是每個家庭里的具體裝修不一樣。

Diablo游戲中的Normal商膊,Hard伏伐,Nightmare,Hell模式晕拆,這些模式的怪和場景和故事情況都差不多藐翎,就是每個場景的怪物和裝備的屬性不一樣∈的唬或是WarCraft中的地圖就是一個Abstract Factory模式(注:Warcraft的地圖什么都能干)阱高。這和學(xué)校中的小學(xué),初中茬缩,高中赤惊,大學(xué)差不多,都是一樣的學(xué)習(xí)環(huán)境凰锡,一樣的教學(xué)方式未舟,一樣的教室,都要期中考和期末考掂为,都有班長和科代表裕膀,就是學(xué)的東西的難度不一樣,但基本上都是語文勇哗、英語昼扛、數(shù)、理、化抄谐。學(xué)校就是一個抽象工廠渺鹦。

這就是抽象工廠的業(yè)務(wù)模型(或是:Business Pattern),你覺得是不是不一定非要用OO來實現(xiàn)這樣的模式蛹含?(我們思考一下毅厚,我們會不會被先入為主了,覺得不會OO都不知道怎么實現(xiàn)了)浦箱,不用OO吸耿,用相同格式但內(nèi)容不同的配置文件是不是也能實現(xiàn)?在Unix下酷窥,抽象工廠這個模式在Unix下就像是/etc/rcX.d下的那些東西蓬推,1代表命令行單用戶板乙,2代表命令行多用戶募逞,3代表命令行多用戶完整模式啟動放接,5代表圖形界面啟動留特,0代表關(guān)機,6代表重啟苟蹈,你要切換的話右核,init <X>就行了。

Prototype模式

原型模式菱鸥,復(fù)制一個類的實現(xiàn)氮采。這個模式在現(xiàn)實中的例子也有很多:傳真染苛,復(fù)印,都是這個模式躯概。Unix進程和Github項目的Fork就是一種。進程fork明顯不是OO的模型(參看:關(guān)于Fork的一道面試題)。用非OO的方法同樣可以實現(xiàn)這個模式骗爆。

Singleton模式

單例模式度陆。生活中,公司只有一個CEO趾诗,法律限制你只能有一個老婆蹬蚁,你只能有一個身份證號犀斋,一個TCP端口只能被一個進程使用,等等叽粹。軟件開發(fā)方面虫几,并不一定只有OO才能做到辆脸,你可以用一個全局變量,一個中心服務(wù)器啡氢,甚至可以使用行政手段來約束開發(fā)中不會出現(xiàn)多個實例空执。Unix下實現(xiàn)單例進程的一個最常用的實踐是在進程啟動的時候用“(S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)”模式打開一個“鎖文件”辨绊。

Adapter模式

適配器模式∨鄱疲可以兼容歐洲美國中國的插頭或插座冻晤,萬能讀卡器,可以播放各種格式多媒體文件的插放器设江,可以解析FTP/HTTP/HTTPS/等網(wǎng)絡(luò)協(xié)議的瀏覽器攘轩,可以兼容各大銀行的銀聯(lián)接口度帮、支付寶、Paypal瞳秽、VISA等銀行接口率翅,可以適配各種后端的解釋器的Nginx或Apache,等等痰洒。用非OO的編程方式就是重新包裝成一個標(biāo)準(zhǔn)接口浴韭。這個模式很像Unix下的/dev下的那些文件念颈,操作系統(tǒng)把系統(tǒng)設(shè)備適配成文件榴芳,于是你就可以使用read/write來進行讀寫了。

Bridge模式

橋接模式讨彼。這個模式用的更多哈误,比如一個燈具可以接各種燈泡或燈管,一個電鉆可以換上不同的鉆頭來適應(yīng)不同的材料菩貌,一輛汽車可以隨時更換不同的輪胎來適應(yīng)不同的路面重荠,你的桌面可以隨時更換一個圖片來適應(yīng)你的心情戈鲁,你的單反相機可以更換不同的鏡頭來拍不同的照片…… 橋接模式說白了就是組件化荞彼,模塊化待笑,可以自由拼裝。在OO中寞缝,其主要是通過讓業(yè)務(wù)類組合一個標(biāo)準(zhǔn)接口來完成荆陆,這在非OO的程序設(shè)計中用得實在是太多了被啼,主要是通過回調(diào)函數(shù)或是標(biāo)準(zhǔn)接口來實現(xiàn)浓体。這個也是Unix設(shè)計哲學(xué)中的主要思想辈讶。在Unix中,文件的權(quán)限使用的就是Bridge模式生闲,標(biāo)準(zhǔn)接口是用戶碍讯,用戶組和其它扯躺,rwx三個模式,然后用 chmod/chown改一改难衰,這文件就有不同的屬主和屬性了逗栽。

Decorator模式。

裝飾模式鳄虱。這個模式在生活中太多了拙已,你給你的手機或電腦貼個什么, 掛個什么索昂,吃東西的時候加點什么佐料,多點肉還是多個蛋缤至,一個Unix/Linux命令的各種參數(shù)是對這個命令的修飾领斥,等等。我覺得這個模式在Unix中最經(jīng)常的體現(xiàn)就是通過管道把命令連接起來來完成一個功能描睦,比如:ps -elf 是列進程的,用管道grep hchen就可以達到過濾的目的隔崎,grep的邏輯沒有侵入ps中韵丑,grep修飾了ps撵彻,但是其組合起來完成了一個特定的功能钓株∈的担可見,這和OO沒有什么關(guān)系轴合。

Facade模式

這個模式我們每個人從會編程的時候就在無意識地用這個模式了创坞。這個模式就是把一大堆類拼裝起來,并統(tǒng)一往外提供提口受葛。在現(xiàn)實生活中這樣的例子太多了题涨,比如:旅行社把機票,酒店总滩,景點纲堵,導(dǎo)游,司機闰渔,進店打了一個包叫旅行席函;IBM把主機冈涧、存儲跟畅、OS奸攻、J2EE、DB、網(wǎng)絡(luò)、流程打了個包叫企業(yè)級解決方案纵刘。Unix中最典型的一個例子就是用Shell腳本組合各種命令來創(chuàng)造一個新的功能,這是的Shell中的各種命令通過標(biāo)準(zhǔn)I/O這個接口進行組合交互。

參考資料:http://www.infoq.com/cn/news/2013/02/chen-design-pattern/

此文章為轉(zhuǎn)載文章,如涉及侵權(quán)。請聯(lián)系我刪除钾挟。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锨并,老刑警劉巖抑党,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡粱挡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門魏蔗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來味混,“玉大人馆衔,你說我怎么就攤上這事篮撑⊥灾ǎ” “怎么了拇砰?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵躁垛,是天一觀的道長土铺。 經(jīng)常有香客問我,道長后德,這世上最難降的妖魔是什么抄腔? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上悟耘,老公的妹妹穿的比我還像新娘。我一直安慰自己揽咕,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布骚烧。 她就那樣靜靜地躺著,像睡著了一般炕矮。 火紅的嫁衣襯著肌膚如雪么夫。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天肤视,我揣著相機與錄音,去河邊找鬼涉枫。 笑死邢滑,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播困后,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼乐纸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了摇予?” 一聲冷哼從身側(cè)響起汽绢,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎侧戴,沒想到半個月后宁昭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡酗宋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年积仗,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜕猫。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡寂曹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出回右,到底是詐尸還是另有隱情隆圆,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布翔烁,位于F島的核電站匾灶,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏租漂。R本人自食惡果不足惜阶女,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望哩治。 院中可真熱鬧秃踩,春花似錦、人聲如沸业筏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蒜胖。三九已至消别,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間台谢,已是汗流浹背寻狂。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留朋沮,地道東北人蛇券。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親纠亚。 傳聞我的和親對象是個殘疾皇子塘慕,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,047評論 2 355

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