設(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ù)用的基石,只有當派生類可以替換掉基類,且軟件單位的功能不受到影響時,基類才能真正被復(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)當盡量少地與其他實體之間發(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ù)都是這個模式,當然,F(xiàn)actory給你的一個對象,而不單單只是資源,factory創(chuàng)建出來的對象都有同樣的接口可以被多態(tài)調(diào)用。這其實和Unix把所有的硬件都factory成文件一樣,并提供了read/write等文件操作來讓你操作任意設(shè)備的I/O。

Abstract Factory模式

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

移動公司的合約機計劃,88套餐(通話100分鐘,短信100條,彩信,20條,上網(wǎng)200M),128套餐(通話200分鐘,短信150條,彩信50條,上網(wǎng)500M)……

家里的裝修,總是要有廚衛(wèi),有門,有燈,有沙發(fā),有茶幾,有床,有衣柜,有電視,有冰箱,有洗衣機……,這些都是必需的,只是每個家庭里的具體裝修不一樣。

Diablo游戲中的Normal,Hard,Nightmare,Hell模式,這些模式的怪和場景和故事情況都差不多,就是每個場景的怪物和裝備的屬性不一樣?;蚴荳arCraft中的地圖就是一個Abstract Factory模式(注:Warcraft的地圖什么都能干)。這和學校中的小學,初中,高中,大學差不多,都是一樣的學習環(huán)境,一樣的教學方式,一樣的教室,都要期中考和期末考,都有班長和科代表,就是學的東西的難度不一樣,但基本上都是語文、英語、數(shù)、理、化。學校就是一個抽象工廠。

這就是抽象工廠的業(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模式

適配器模式??梢约嫒輾W洲美國中國的插頭或插座,萬能讀卡器,可以播放各種格式多媒體文件的插放器,可以解析FTP/HTTP/HTTPS/等網(wǎng)絡(luò)協(xié)議的瀏覽器,可以兼容各大銀行的銀聯(lián)接口、支付寶、Paypal、VISA等銀行接口,可以適配各種后端的解釋器的Nginx或Apache,等等。用非OO的編程方式就是重新包裝成一個標準接口。這個模式很像Unix下的/dev下的那些文件,操作系統(tǒng)把系統(tǒng)設(shè)備適配成文件,于是你就可以使用read/write來進行讀寫了。

Bridge模式

橋接模式。這個模式用的更多,比如一個燈具可以接各種燈泡或燈管,一個電鉆可以換上不同的鉆頭來適應(yīng)不同的材料,一輛汽車可以隨時更換不同的輪胎來適應(yīng)不同的路面,你的桌面可以隨時更換一個圖片來適應(yīng)你的心情,你的單反相機可以更換不同的鏡頭來拍不同的照片…… 橋接模式說白了就是組件化,模塊化,可以自由拼裝。在OO中,其主要是通過讓業(yè)務(wù)類組合一個標準接口來完成,這在非OO的程序設(shè)計中用得實在是太多了,主要是通過回調(diào)函數(shù)或是標準接口來實現(xiàn)。這個也是Unix設(shè)計哲學中的主要思想。在Unix中,文件的權(quán)限使用的就是Bridge模式,標準接口是用戶,用戶組和其它,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)實生活中這樣的例子太多了,比如:旅行社把機票,酒店,景點,導游,司機,進店打了一個包叫旅行;IBM把主機、存儲、OS、J2EE、DB、網(wǎng)絡(luò)、流程打了個包叫企業(yè)級解決方案。Unix中最典型的一個例子就是用Shell腳本組合各種命令來創(chuàng)造一個新的功能,這是的Shell中的各種命令通過標準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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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