設(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)系我刪除钾挟。