開發(fā)中經(jīng)常使用的5種設(shè)計(jì)模式
提到設(shè)計(jì)模式,很多人都會(huì)覺得老生常談,有些人覺得設(shè)計(jì)模式很有必要,有些人覺得設(shè)計(jì)模式?jīng)]那么重要,那么我們在工作中是否應(yīng)該重視設(shè)計(jì)模式呢?我們是否應(yīng)該將設(shè)計(jì)模式大量應(yīng)用到我們的生產(chǎn)過程中呢?
如果你從未聽說過設(shè)計(jì)模式,我敢打賭你一定不是一個(gè)合格程序員。這就好比一個(gè)人說他自己是數(shù)學(xué)家,但是他連勾股定理都沒聽過,這怎么可能?
工廠模式
這是一個(gè)最基礎(chǔ)的設(shè)計(jì)模式,也是最常用的設(shè)計(jì)模式,這是一個(gè)我們平時(shí)一直在使用,但卻不知道自己在使用的設(shè)計(jì)模式。
工廠模式故名思意就是一個(gè)加工廠,不同于現(xiàn)實(shí)的是,這里生產(chǎn)的不是衣服,皮鞋,褲子等,而是我們面向?qū)ο缶幊讨凶钪匾膶ο蟆?/p>
現(xiàn)實(shí)中工廠的好處我們都知道,不僅可以批量生產(chǎn),還可以批量定制,因?yàn)橛兄煌哪>撸梢陨a(chǎn)出人們需要的各種類型的產(chǎn)品。
軟件開發(fā)中,我們更關(guān)注的是使用對象的方法,至于對象如何創(chuàng)建的,我們并不是很關(guān)心,因此,抽象工廠解決了我們的問題。我們只需要訂制我們需要的產(chǎn)品功能接口,然后讓工廠按照我們的接口,也就是實(shí)現(xiàn)接口生產(chǎn)對象即可。
通過這樣的調(diào)用,我們的產(chǎn)品如果有問題的話,可以隨時(shí)召回,可以隨時(shí)被工廠補(bǔ)丁修補(bǔ),實(shí)現(xiàn)了產(chǎn)品的靈活擴(kuò)展。
適配器模式
現(xiàn)實(shí)中,我們經(jīng)常給手機(jī)充電,而我們使用的就是電源適配器,為什么叫適配器呢?因?yàn)樗粌H可以給我們自己的手機(jī)充電,也可以給別人的手機(jī)充電,甚至還可以給其它用電設(shè)備充電,因?yàn)樗梢赃m應(yīng)各種充電設(shè)備,所以叫做適配器。
軟件開發(fā)中,我們幾乎或者不可能離開數(shù)據(jù)庫而去開發(fā)一款應(yīng)用,那么選擇什么數(shù)據(jù)庫是我們最需要關(guān)心的,因?yàn)槿绻x擇錯(cuò)了,可能后期在性能上就會(huì)出現(xiàn)瓶頸,那么有沒有一種辦法可以讓我們在不修改代碼,或者修改很少的代碼情況下進(jìn)行數(shù)據(jù)庫的無縫切換呢?答案就是適配器模式。
我們首先定義好適配器接口,然后讓各種數(shù)據(jù)庫實(shí)現(xiàn)我們定義好的接口,我們在代碼中使用接口中定義的方法,這樣當(dāng)我們想要切換數(shù)據(jù)庫的時(shí)候,只要將該數(shù)據(jù)庫實(shí)現(xiàn)對應(yīng)接口的方法,我們就可以完成數(shù)據(jù)庫的適配,就可以無縫連接。
觀察者模式
觀察者模式,又叫做通知模式,是一種一對多的模式。現(xiàn)實(shí)中,當(dāng)校長或者老師在臺(tái)上發(fā)布一個(gè)命令的時(shí)候,廣播喇叭就會(huì)將命令傳達(dá)給每個(gè)學(xué)生,學(xué)生們聽到命令的時(shí)候,都會(huì)有自己的反應(yīng),校長或者老師不必向?qū)W生一個(gè)個(gè)傳達(dá),因?yàn)閺V播喇叭會(huì)把命令傳給學(xué)生,這里廣播喇叭就是一個(gè)觀察者,而老師和校長就是被觀察者,學(xué)生們就是被通知對象,因此觀察者模式也叫做發(fā)布訂閱模式。
在軟件開發(fā)中,比如我們的產(chǎn)品有這樣一個(gè)功能,用戶下單支付成功之后,就會(huì)發(fā)送一條短信通知用戶,如果之后希望不僅發(fā)送短信,還需要發(fā)送郵件,還需要語音通知,在這樣的情況下,我們就可以采用觀察者模式,我們將支付成功信息放入到消息隊(duì)列中,至于發(fā)短信還是發(fā)郵件,由各個(gè)業(yè)務(wù)模塊訂閱消息隊(duì)列自己處理。這樣在訂單模塊里面,就不需要一個(gè)個(gè)通知短信模塊,郵件模塊了。
裝飾器模式
現(xiàn)實(shí)生活中,一般情況下一個(gè)人換了一件衣服之后,我們依然可以認(rèn)出他,衣服就是他的裝飾,說明裝飾并不影響一個(gè)人的容貌,也就是不影響這個(gè)人的功能,但是通過穿著一件高檔外衣,卻可以提升一個(gè)人的氣質(zhì),這就是裝飾的作用,而裝飾器模式就是通過裝飾一個(gè)對象而不改變對象來讓這個(gè)對象更強(qiáng)大。
舉一個(gè)軟件開發(fā)中的案例,比如我們已經(jīng)設(shè)計(jì)好一個(gè)短信發(fā)送功能,并且經(jīng)過測試和線上測試這個(gè)功能是沒有任何問題的,但是現(xiàn)在有一個(gè)新的需求,要求發(fā)送短信的時(shí)候,還能語音提醒,我們?nèi)绾文軌蛟诓挥绊懺械墓δ芮闆r下,實(shí)現(xiàn)這個(gè)功能呢,這個(gè)時(shí)候我們就可以使用裝飾器,也就是給短息發(fā)送類裝飾一個(gè)語音功能,讓它不僅可以發(fā)送短信,此外還可以實(shí)現(xiàn)語音發(fā)送的功能。
策略模式
策略故名思意就是實(shí)現(xiàn)目標(biāo)方案的集合,簡單來說就是各種方法的集合,他們都是用來實(shí)現(xiàn)一件事情的。
軟件開發(fā)中,一個(gè)對象對不同場景采用不同的策略去實(shí)現(xiàn)同一個(gè)功能,就是策略方法,如果你聽說過多態(tài),就會(huì)發(fā)現(xiàn)它和多態(tài)的定義很像,不同的是多態(tài)是不同對象對同一操作的不同的處理方法,而策略模式是同一個(gè)對象對同一個(gè)操作采用不同的策略進(jìn)行處理操作。
比如,我們有一個(gè)國慶7天游的項(xiàng)目,起始點(diǎn)和目的地都是從北京到莫斯科,但是可以采用不同的策略,可以飛機(jī),可以火車,可以自駕,同一個(gè)夢想,不同的實(shí)現(xiàn)方式。
淘寶首頁的千人千面也是策略模式,都是顯示商品,面對不同的人,顯示的就是不同的商品,這就是由策略決定的。
總結(jié)
如果你足夠細(xì)心的話,軟件開發(fā)中的設(shè)計(jì)模式并不是憑空產(chǎn)生的,它一定是來源于生活,其實(shí),任何知識(shí)的產(chǎn)生都是來源于生活,只不過我們經(jīng)過學(xué)習(xí)提煉之后,將它高于生活。
設(shè)計(jì)模式不是萬能的,它并不能幫助你解決所有問題,但是它可以幫助你解決大部分問題,并且在編碼中使用設(shè)計(jì)模式的話,你會(huì)發(fā)現(xiàn),你的代碼看起來會(huì)更加清晰,更加有條理。
學(xué)習(xí)設(shè)計(jì)模式,使用設(shè)計(jì)模式并不是最終的目的,我們的最終目的是無招勝有招,當(dāng)你把所有的設(shè)計(jì)模式全忘記的時(shí)候,但是在編碼中卻能運(yùn)用它們的時(shí)候,你才算沒白學(xué)設(shè)計(jì)模式。