1般來講,經常使用的設計模式有以下8種:單例、工廠、視察者、代理、命令、適配器、合成、訪問者
單例模式:目的是為了讓系統中只有1個調用對象,缺點是單例使其他程序過分依賴它,而且不同單例運行在不同進程中,使得保護困難;
工廠模式:生產固定的1些東西,如抽象類,缺點是產品修改麻煩;如喜歡動作片和愛情片的人分別向服務器發出同1個要求,就能夠得到他們想看的影片集,相當于不同對象進行同1要求,需求均得到滿足。
視察者模式:就是多個對象對1個對象進行監控,如緩存;
代理模式:自己的事交給他人去做,分別返回結果便可,如異步線程;
命令模式:調用對象與作用對象之間分離,由中間件來調和二者之間的工作,如控制器;
適配器模式:將1個接口變成用戶所需要的接口,如baseadapter可以適配listview和spinner,由于它們有相同的接口
合成模式:將1對多的關系轉換成1對整體的關系,如listview與適配器;
訪問者模式:對不同的對象采取不同的處理,如instanceof。
網上有1哥們把設計模式解釋的很有趣,就摘錄到下面,但找不到原作者了,所以沒加原地址還請見諒哈!
創建型模式
1、FACTORY—追MM少不了請吃飯了,麥當勞的雞翅和肯德基的雞翅都是MM愛吃的東西,雖然口味有所不同,但不管你帶MM去麥當勞或肯德基,只管向服務員說“來4個雞翅”就好了。麥當勞和肯德基就是生產雞翅的Factory
工廠模式:客戶類和工廠類分開。消費者任什么時候候需要某種產品,只需向工廠要求便可。消費者不必修改就能夠接納新產品。缺點是當產品修改時,工廠類也要做相應的修改。如:如何創建及如何向客戶端提供。
2、BUILDER—MM最愛聽的就是“我愛你”這句話了,見到不同地方的MM,要能夠用她們的方言跟她說這句話哦,我有1個多種語言翻譯機,上面每種語言都有1個按鍵,見到MM我只要按對應的鍵,它就可以夠用相應的語言說出“我愛你”這句話了,國外的MM也能夠輕松弄掂,這就是我的“我愛你”builder。(這1定比美軍在伊拉克用的翻譯機好賣)
建造模式:將產品的內部表象和產品的生成進程分割開來,從而使1個建造進程生成具有不同的內部表象的產品對象。建造模式使得產品內部表象可以獨立的變化,客戶沒必要知道產品內部組成的細節。建造模式可以強迫實行1種分步驟進行的建造進程。
3、FACTORY METHOD—請MM去麥當勞吃漢堡,不同的MM有不同的口味,要每一個都記住是1件煩人的事情,我1般采取Factory Method模式,帶著MM到服務員那兒,說“要1個漢堡”,具體要甚么樣的漢堡呢,讓MM直接跟服務員說就好了。
工廠方法模式:核心工廠類不再負責所有產品的創建,而是將具體創建的工作交給子類去做,成為1個抽象工廠角色,僅負責給出具體工廠類必須實現的接口,而不接觸哪個產品類應當被實例化這類細節。
4、PROTOTYPE—跟MM用QQ聊天,1定要說些深情的話語了,我搜集了好多肉麻的情話,需要時只要copy出來放到QQ里面就好了,這就是我的情話prototype了。(100塊錢1份,你要不要)
原始模型模式:通過給出1個原型對象來指明所要創建的對象的類型,然后用復制這個原型對象的方法創建出更多同類型的對象。原始模型模式允許動態的增加或減少產品類,產品類不需要非得有任何事前肯定的等級結構,原始模型模式適用于任何的等級結構。缺點是每個類都必須配備1個克隆方法。
5、SINGLETON—俺有6個漂亮的老婆,她們的老公都是我,我就是我們家里的老公Sigleton,她們只要說道“老公”,都是指的同1個人,那就是我(剛才做了個夢啦,哪有這么好的事)
單例模式:單例模式確保某1個類只有1個實例,而且自行實例化并向全部系統提供這個實例單例模式。單例模式只應在有真實的“單1實例”的需求時才可以使用。
結構型模式
6、ADAPTER—在朋友集會上碰到了1個美女Sarah,從香港來的,可我不會說粵語,她不會說普通話,只好求助于我的朋友kent了,他作為我和Sarah之間的Adapter,讓我和Sarah可以相互交談了(也不知道他會不會耍我)
適配器(變壓器)模式:把1個類的接口變換成客戶端所期待的另外一種接口,從而使本來因接口緣由不匹配而沒法1起工作的兩個類能夠1起工作。適配類可以根據參數返還1個適合的實例給客戶端。
7、BRIDGE—早上碰到MM,要說早上好,晚上碰到MM,要說晚上好;碰到MM穿了件新衣服,要說你的衣服好漂亮哦,碰到MM新做的發型,要說你的頭發好漂亮哦。不要問我“早上碰到MM新做了個發型怎樣說”這類問題,自己用BRIDGE組合1下不就好了
橋梁模式:將抽象化與實現化脫耦,使得2者可以獨立的變化,也就是說將他們之間的強關聯變成弱關聯,也就是指在1個軟件系統的抽象化和實現化之間使用組合/聚合關系而不是繼承關系,從而使二者可以獨立的變化。
8、COMPOSITE—Mary今天過生日。“我過生日,你要送我1件礼物。”“嗯,好吧,去商店,你自己挑。”“這件T恤挺漂亮,買,這條裙子好看,買,這個包也不錯,買。”“喂,買了3件了呀,我只答應送1件礼物的哦。”“甚么呀,T恤加裙子加包包,正好配成1套呀,MM,麻煩你包起來。”“……”,MM都會用Composite模式了,你會了沒有?
合成模式:合成模式將對象組織到樹結構中,可以用來描寫整體與部份的關系。合成模式就是1個處理對象的樹結構的模式。合成模式把部份與整體的關系用樹結構表示出來。合成模式使得客戶端把1個個單獨的成份對象和由他們復合而成的合成對象同等看待。
9、DECORATOR—Mary過完輪到Sarly過生日,還是不要叫她自己挑了,不然這個月伙食費肯定玩完,拿出我去年在西岳頂上照的照片,在背面寫上“最好的的礼物,就是愛你的Fita”,再到街上礼品店買了個像框(賣礼品的MM也很漂亮哦),再找隔壁弄美術設計的Mike設計了1個漂亮的盒子裝起來……,我們都是Decorator,終究都在修飾我這個人呀,怎樣樣,看懂了嗎?
裝潢模式:裝潢模式以對客戶端透明的方式擴大對象的功能,是繼承關系的1個替換方案,提供比繼承更多的靈活性。動態給1個對象增加功能,這些功能可以再動態的撤銷。增加由1些基本功能的排列組合而產生的非常大量的功能。
10、FACADE—我有1個專業的Nikon相機,我就喜歡自己手動調光圈、快門,這樣照出來的照片才專業,但MM可不懂這些,教了半天也不會。幸虧相機有Facade設計模式,把相機調劑到自動檔,只要對準目標按快門就好了,1切由相機自動調劑,這樣MM也能夠用這個相機給我拍張照片了。
門面模式:外部與1個子系統的通訊必須通過1個統1的門面對象進行。門面模式提供1個高層次的接口,使得子系統更容易于使用。每個子系統只有1個門面類,而且此門面類只有1個實例,也就是說它是1個單例模式。但全部系統可以有多個門面類。
11、FLYWEIGHT—每天跟MM發短信,手指都累死了,最近買了個新手機,可以把1些經常使用的句子存在手機里,要用的時候,直接拿出來,在前面加上MM的名字就能夠發送了,再不用1個字1個字敲了。同享的句子就是Flyweight,MM的名字就是提取出來的外部特點,根據上下文情況使用。
享元模式:FLYWEIGHT在拳擊比賽中指最輕量級。享元模式以同享的方式高效的支持大量的細粒度對象。享元模式能做到同享的關鍵是辨別內蘊狀態和外蘊狀態。內蘊狀態存儲在享元內部,不會隨環境的改變而有所不同。外蘊狀態是隨環境的改變而改變的。外蘊狀態不能影響內蘊狀態,它們是相互獨立的。將可以同享的狀態和不可以同享的狀態從常規類中辨別開來,將不可以同享的狀態從類里剔除出去。客戶端不可以直接創建被同享的對象,而應當使用1個工廠對象負責創建被同享的對象。享元模式大幅度的下降內存中對象的數量。
12、PROXY—跟MM在網上聊天,1開頭總是“hi,你好”,“你從哪兒來呀?”“你多大了?”“身高多少呀?”這些話,真煩人,寫個程序做為我的Proxy吧,凡是接收到這些話都設置好了自動的回答,接收到其他的話時再通知我回答,怎樣樣,酷吧。
代理模式:代理模式給某1個對象提供1個代理對象,并由代理對象控制對源對象的援用。代理就是1個人或1個機構代表另外一個人或1個機構采取行動。某些情況下,客戶不想或不能夠直接援用1個對象,代理對象可以在客戶和目標對象直接起到中介的作用。客戶端分辨不出代理主題對象與真實主題對象。代理模式可以其實不知道真實的被代理對象,而僅僅持有1個被代理對象的接口,這時候候代理對象不能夠創建被代理對象,被代理對象必須有系統的其他角色代為創建并傳入。
行動模式
13、CHAIN OF RESPONSIBLEITY—晚上去上英語課,為了好開溜坐到了最后1排,哇,前面坐了好幾個漂亮的MM哎,找張紙條,寫上“Hi,可以做我的女朋友嗎?如果不愿意請向前傳”,紙條就1個接1個的傳上去了,糟,傳到第1排的MM把紙條傳給老師了,聽說是個老處女呀,快跑!
責任鏈模式:在責任鏈模式中,很多對象由每個對象對其下家的援用而接
起來構成1條鏈。要求在這個鏈上傳遞,直到鏈上的某1個對象決定處理此要求。客戶其實不知道鏈上的哪個對象終究處理這個要求,系統可以在不影響客戶真個情況下動態的重新組織鏈和分配責任。處理者有兩個選擇:承當責任或把責任推給下家。1個要求可以終究不被任何接收端對象所接受。
14、COMMAND—俺有1個MM家里管得特別嚴,沒法見面,只好借助于她弟弟在我們倆之間傳送信息,她對我有甚么唆使,就寫1張紙條讓她弟弟帶給我。這不,她弟弟又傳送過來1個COMMAND,為了感謝他,我請他吃了碗雜醬面,哪知道他說:“我同時給我姐姐3個男朋友送COMMAND,就數你最吝嗇,才請我吃面。”,:-(
命令模式:命令模式把1個要求或操作封裝到1個對象中。命令模式把發出命令的責任和履行命令的責任分割開,委派給不同的對象。命令模式允許要求的1方和發送的1方獨立開來,使得要求的1方沒必要知道接收要求的1方的接口,更沒必要知道要求是怎樣被接收,和操作是不是履行,什么時候被履行和是怎樣被履行的。系統支持命令的撤銷。
15、INTERPRETER—俺有1個《泡MM真經》,上面有各種泡MM的攻略,比如說去吃西餐的步驟、去看電影的方法等等,跟MM約會時,只要做1個Interpreter,照著上面的腳本履行就能夠了。
解釋器模式:給定1個語言后,解釋器模式可以定義出其文法的1種表示,并同時提供1個解釋器。客戶端可使用這個解釋器來解釋這個語言中的句子。解釋器模式將描寫怎樣在有了1個簡單的文法后,使用模式設計解釋這些語句。在解釋器模式里面提到的語言是指任何解釋器對象能夠解釋的任何組合。在解釋器模式中需要定義1個代表文法的命令類的等級結構,也就是1系列的組合規則。每個命令對象都有1個解釋方法,代表對命令對象的解釋。命令對象的等級結構中的對象的任何排列組合都是1個語言。
16、ITERATOR—我愛上了Mary,不顧1切的向她求婚。
Mary:“想要我跟你結婚,得答應我的條件”
我:“甚么條件我都答應,你說吧”
Mary:“我看上了那個1克拉的鉆石”
我:“我買,我買,還有嗎?”
Mary:“我看上了湖邊的那棟別墅”
我:“我買,我買,還有嗎?”
Mary:“你的小弟弟必須要有50cm長”
我腦袋嗡的1聲,坐在椅子上,1咬牙:“我剪,我剪,還有嗎?”
……
迭代子模式:迭代子模式可以順序訪問1個聚集中的元素而沒必要暴露聚集的內部表象。多個對象聚在1起構成的整體稱之為聚集,聚集對象是能夠包容1組對象的容器對象。迭代子模式將迭代邏輯封裝到1個獨立的子對象中,從而與聚集本身隔開。迭代子模式簡化了聚集的界面。每個聚集對象都可以有1個或1個以上的迭代子對象,每個迭代子的迭代狀態可以是彼此獨立的。迭代算法可以獨立于聚集角色變化。
17、MEDIATOR—4個MM打麻將,相互之間誰應當給誰多少錢算不清楚了,幸虧當時我在旁邊,依照各自的籌馬數算錢,賺了錢的從我這里拿,賠了錢的也付給我,1切就OK啦,俺得到了4個MM的電話。
調停者模式:調停者模式包裝了1系列對象相互作用的方式,使得這些對象沒必要相互明顯作用。從而使他們可以疏松偶合。當某些對象之間的作用產生改變時,不會立即影響其他的1些對象之間的作用。保證這些作用可以彼此獨立的變化。調停者模式將多對多的相互作用轉化為1對多的相互作用。調停者模式將對象的行動和協作抽象化,把對象在小尺度的行動上與其他對象的相互作用分開處理。
18、MEMENTO—同時跟幾個MM聊天時,1定要記清楚剛才跟MM說了些甚么話,不然MM發現了會不高興的哦,幸虧我有個備忘錄,剛才與哪一個MM說了甚么話我都拷貝1份放到備忘錄里面保存,這樣可以隨時觀察之前的記錄啦。
備忘錄模式:備忘錄對象是1個用來存儲另外1個對象內部狀態的快照的對象。備忘錄模式的意圖是在不破壞封裝的條件下,將1個對象的狀態捉住,并外部化,存儲起來,從而可以在將來適合的時候把這個對象還原到存儲起來的狀態。
19、OBSERVER—想知道我們公司最新MM情報嗎?加入公司的MM情報郵件組就好了,tom負責搜集情報,他發現的新情報不用1個1個通知我們,直接發布給郵件組,我們作為定閱者(視察者)就能夠及時收到情報啦
視察者模式:視察者模式定義了1種1隊多的依賴關系,讓多個視察者對象同時監聽某1個主題對象。這個主題對象在狀態上產生變化時,會通知所有視察者對象,使他們能夠自動更新自己。
20、STATE—跟MM交往時,1定要注意她的狀態哦,在不同的狀態時她的行動會有不同,比如你約她今天晚上去看電影,對你沒興趣的MM就會說“有事情啦”,對你不討厭但還沒喜歡上的MM就會說“好啊,不過可以帶上我同事么?”,已喜歡上你的MM就會說“幾點鐘?看完電影再去泡吧怎樣樣?”,固然你看電影進程中表現良好的話,也能夠把MM的狀態從不討厭不喜歡變成喜歡哦。
狀態模式:狀態模式允許1個對象在其內部狀態改變的時候改變行動。這個對象看上去象是改變了它的類1樣。狀態模式把所研究的對象的行動包裝在不同的狀態對象里,每個狀態對象都屬于1個抽象狀態類的1個子類。狀態模式的意圖是讓1個對象在其內部狀態改變的時候,其行動也隨之改變。狀態模式需要對每個系統可能獲得的狀態創建1個狀態類的子類。當系統的狀態變化時,系統便改變所選的子類。
21、STRATEGY—跟不同類型的MM約會,要用不同的策略,有的請電影比較好,有的則去吃小吃效果不錯,有的去海邊浪漫最適合,單目的都是為了得到MM的芳心,我的追MM錦囊中有好多Strategy哦。
策略模式:策略模式針對1組算法,將每個算法封裝到具有共同接口的獨立的類中,從而使得它們可以相互替換。策略模式使得算法可以在不影響到客戶真個情況下產生變化。策略模式把行動和環境分開。環境類負責保持和查詢行動類,各種算法在具體的策略類中提供。由于算法和環境獨立開來,算法的增減,修改都不會影響到環境和客戶端。
22、TEMPLATE METHOD——看過《如何說服女生上床》這部經典文章嗎?女生從認識到上床的不變的步驟分為巧遇、打破僵局、展開尋求、接吻、前戲、動手、愛撫、進去8大步驟(Template method),但每一個步驟針對不同的情況,都有不1樣的做法,這就要看你隨機應變啦(具體實現);
模板方法模式:模板方法模式準備1個抽象類,將部份邏輯以具體方法和具體構造子的情勢實現,然后聲明1些抽象方法來迫使子類實現剩余的邏輯。不同的子類可以以不同的方式實現這些抽象方法,從而對剩余的邏輯有不同的實現。先制定1個頂級邏輯框架,而將邏輯的細節留給具體的子類去實現。
23、VISITOR—情人節到了,要給每一個MM送1束鮮花和1張卡片,可是每一個MM送的花都要針對她個人的特點,每張卡片也要根據個人的特點來挑,我1個人哪弄得清楚,還是找花店老板和礼品店老板做1下Visitor,讓花店老板根據MM的特點選1束花,讓礼品店老板也根據每一個人特點選1張卡,這樣就輕松多了;
訪問者模式:訪問者模式的目的是封裝1些施加于某種數據結構元素之上的操作。1旦這些操作需要修改的話,接受這個操作的數據結構可以保持不變。訪問者模式適用于數據結構相對未定的系統,它把數據結構和作用于結構上的操作之間的耦合擺脫開,使得操作集合可以相對自由的演變。訪問者模式使得增加新的操作變的很容易,就是增加1個新的訪問者類。訪問者模式將有關的行動集中到1個訪問者對象中,而不是分散到1個個的節點類中。當使用訪問者模式時,要將盡量多的對象閱讀邏輯放在訪問者類中,而不是放到它的子類中。訪問者模式可以跨過幾個類的等級結構訪問屬于不同的等級結構的成員類。
下一篇 Go起步:8、Go的函數