设计模式(四)结构型模式
前言
結(jié)構(gòu)型設(shè)計(jì)模式,主要研究:
- 主要有哪些場(chǎng)景使用結(jié)構(gòu)型設(shè)計(jì)模式;
- 每種場(chǎng)景應(yīng)該使用何種設(shè)計(jì)模式;
- 以程序中的功能為核心,研究程序功能的組織結(jié)構(gòu)。所以這一章,我們要把“功能結(jié)構(gòu)”作為研究的核心。
下面分別對(duì)幾種結(jié)構(gòu)型模式加以說(shuō)明。
1. 適配器模式
示例:適配器模式
使用場(chǎng)景
想要在系統(tǒng)中添加某個(gè)功能,類似的功能在其他項(xiàng)目中已經(jīng)實(shí)現(xiàn),而且經(jīng)過(guò)分析,舊的接口可以經(jīng)過(guò)適當(dāng)?shù)姆庋b,轉(zhuǎn)換成新的適用于當(dāng)前系統(tǒng)的接口。這樣可以最大程度地復(fù)用已有的模塊。
原理
通過(guò)適配器將已有功能的舊的接口,轉(zhuǎn)換為新的接口,從而實(shí)現(xiàn)使已有的功能為新的系統(tǒng)服務(wù)的目的。
不適用的情況
以下情況下,不要使用適配器模式:
- 舊的接口無(wú)法轉(zhuǎn)換成新的接口;
- 寫適配器的工作量幾乎可以重寫所需的功能時(shí)。
使用須知
適配器模式其實(shí)是一種取巧的做法,在使用時(shí)需要慎重考慮。已有功能通過(guò)適配器集成到新的系統(tǒng)后,如果出現(xiàn)問(wèn)題或者需要進(jìn)行功能擴(kuò)展,其維護(hù)成本是一個(gè)需要考慮的問(wèn)題。例如,已有功能是否使用了過(guò)時(shí)的技術(shù),或者資料不全,都可能成為項(xiàng)目的風(fēng)險(xiǎn)所在。
本質(zhì)
適配器模式本質(zhì)上是通過(guò)將一接口封裝成另一種接口,實(shí)現(xiàn)了模塊功能復(fù)用。
2. 橋接模式
示例:橋接模式
使用場(chǎng)景
橋接模式是少用繼承,多用組合的第一例。
拿菜鳥教程中的例子來(lái)說(shuō),假如我們現(xiàn)在要實(shí)現(xiàn)圓類,包括紅色圓和綠色圓兩種圓。
首先容易想到的方法是,先寫一個(gè)圓基類,并添加一個(gè)虛(virtual)的繪制函數(shù)。然后分別派生出紅色圓類和綠色圓類,在子類中分別重新實(shí)現(xiàn)繪制函數(shù),將圓繪制成指定的顏色。
在這種簡(jiǎn)單的例子中,使用繼承是沒什么問(wèn)題的。但是假如圓基類還有一個(gè)虛函數(shù),此虛函數(shù)用于對(duì)圓進(jìn)行旋轉(zhuǎn)。旋轉(zhuǎn)分為兩種,順時(shí)針和逆時(shí)針旋轉(zhuǎn)。我們想要四種類型的圓:
- 順時(shí)針旋轉(zhuǎn)的紅色圓
- 順時(shí)針旋轉(zhuǎn)的綠色圓
- 逆時(shí)針旋轉(zhuǎn)的紅色圓
- 逆時(shí)針旋轉(zhuǎn)的綠色圓
如何使用繼承來(lái)實(shí)現(xiàn)呢?難道要派生出四個(gè)子類嗎?如果還有其他功能組合呢?要多少個(gè)類呢?這樣下去無(wú)疑會(huì)導(dǎo)致“類的數(shù)量爆炸”問(wèn)題。
原理
結(jié)構(gòu)型模式是研究程序功能組織方法的設(shè)計(jì)模式。當(dāng)程序中需要對(duì)幾種功能相互組合時(shí),應(yīng)該用組合,不要用繼承。
橋接模式下,對(duì)于每個(gè)功能,應(yīng)該提取出一個(gè)接口類,這個(gè)接口類可以有不同的實(shí)現(xiàn)。而代表不同的功能接口,可以作為主體類(此例中為圓類)的成員變量,放在一起。需要什么功能,就new哪種接口子類,保存在接口變量中,這樣就可以把不同的功能組合起來(lái)。
這樣一來(lái),類的數(shù)量會(huì)保持在最低水平。
相對(duì)于繼承,橋接模式相當(dāng)于把主體類中的每個(gè)虛函數(shù)都單獨(dú)提取出來(lái),構(gòu)成 一個(gè)接口類。這個(gè)接口類連接了具體實(shí)現(xiàn)和主體類,所以這個(gè)模式叫橋接模式。這個(gè)名字其實(shí)不是很能反映此模式的內(nèi)涵,其實(shí)叫“功能組合模式”更為貼切。
可能有的小伙伴會(huì)說(shuō),上面的功能其實(shí)用C語(yǔ)言實(shí)現(xiàn)不是更簡(jiǎn)單嗎?
- 用一個(gè)結(jié)構(gòu)體代表圓,有半徑、邊框?qū)挾鹊葘傩?#xff1b;
- 每種功能就是一個(gè)函數(shù),參數(shù)為圓的結(jié)構(gòu)體。
這不就完成了嗎?是的!
這個(gè)場(chǎng)景下,確實(shí)使用C語(yǔ)言實(shí)現(xiàn)更簡(jiǎn)單,不需要使用C++面向?qū)ο蟮娜魏翁匦约纯蓪?shí)現(xiàn)。可以看出,C++的面向?qū)ο蟮奶匦?#xff0c;并不是萬(wàn)能的,并不是在所有情況下都是最優(yōu)的,甚至有時(shí)候不如C語(yǔ)言簡(jiǎn)單直接。從另一個(gè)角度說(shuō)明,大家在面向?qū)ο缶幊痰臅r(shí)候,不要把自己的思維局限于面向?qū)ο?#xff0c;面向?qū)ο笏枷朐谝恍r(shí)候,是不如面向過(guò)程的,甚至?xí)压δ芙Y(jié)構(gòu)復(fù)雜化,設(shè)計(jì)到最后導(dǎo)致代碼難以維護(hù)都是有可能的。
使用須知
橋接模式會(huì)導(dǎo)致代碼中存在設(shè)計(jì)模式的代碼,會(huì)增加代碼的理解難度。相對(duì)來(lái)說(shuō),積極作用還是遠(yuǎn)大于副作用的。
本質(zhì)
橋接模式的本質(zhì)是:
如果項(xiàng)目中出現(xiàn)了功能組合的場(chǎng)景,使用繼承封裝功能是錯(cuò)誤做法,要把功能單獨(dú)提取出來(lái)分別封裝好以后,再進(jìn)行組合。
3. 過(guò)濾器模式
示例:過(guò)濾器模式
使用場(chǎng)景
現(xiàn)有一組對(duì)象,我們想要根據(jù)不同的過(guò)濾條件,篩選出符合條件的一部分對(duì)象。
一般寫法
最簡(jiǎn)單粗暴的方法是,在需要進(jìn)行篩選過(guò)濾的地方,直接遍歷對(duì)象數(shù)組,在循環(huán)體內(nèi)進(jìn)行條件判斷。這種寫法的優(yōu)點(diǎn)是簡(jiǎn)單直接,缺點(diǎn)是如果有多個(gè)地方需要使用篩選過(guò)濾功能,則需要在多個(gè)地方編寫重復(fù)的代碼,這會(huì)降低代碼的復(fù)用性和可維護(hù)性。
推薦寫法
使用過(guò)濾器模式,把篩選功能封裝起來(lái)使用即可。接口也很好定義,輸入對(duì)象數(shù)組,輸出符號(hào)條件的對(duì)象數(shù)組。
本質(zhì)
過(guò)濾器模式的本質(zhì)是:
當(dāng)需要從一組對(duì)象中過(guò)濾出一部分符合條件的對(duì)象時(shí),可以考慮將每種過(guò)濾功能都封裝為一個(gè)類,提高代碼復(fù)用性和可維護(hù)性。
4. 組合模式
示例:組合模式
組合模式是一種樹形的對(duì)象組織結(jié)構(gòu),在建造者模式已有相關(guān)說(shuō)明,這里不再贅述。
5. 裝飾器模式
示例:裝飾器模式
使用場(chǎng)景
裝飾器模式的研究對(duì)象有兩個(gè):
- 已有功能
- 擴(kuò)展功能
當(dāng)我們需要擴(kuò)展一個(gè)類的功能,但是又不想直接在此類上進(jìn)行改動(dòng)時(shí),一般的做法是使用繼承來(lái)實(shí)現(xiàn)。繼承出來(lái)的子類具有父類的屬性和方法,在父類基礎(chǔ)上可以添加新的功能。
除了繼承,還可以使用裝飾器模式。裝飾器模式是指,新建一個(gè)擴(kuò)展類,將被擴(kuò)展類的對(duì)象作為擴(kuò)展類的成員變量保存,在擴(kuò)展類中,操作被擴(kuò)展類,實(shí)現(xiàn)新的方法和功能。
簡(jiǎn)單來(lái)說(shuō),裝飾器模式就是新建一個(gè)類把已有類的功能包裝起來(lái),實(shí)現(xiàn)新的功能。
使用須知
裝飾器模式和繼承各有優(yōu)缺點(diǎn),使用時(shí)要加以權(quán)衡,選擇最優(yōu)的方案。
本質(zhì)
從本質(zhì)上說(shuō):
裝飾器模式通過(guò)將已有功能作為成員變量整個(gè)封裝(包裝)起來(lái),擴(kuò)展的新功能,和已有功能耦合最小,互不影響。
6. 外觀模式
示例:裝飾器模式
本質(zhì)
這個(gè)模式比較簡(jiǎn)單不再贅述。其本質(zhì)是:
將已有功能封裝起來(lái),提供更易于使用的接口,屏蔽更多實(shí)現(xiàn)細(xì)節(jié),等于是加了一個(gè)中間層。
7. 享元模式
示例:享元模式
按照我們的分類,此模式應(yīng)該屬于創(chuàng)建型模式。它是借助工廠模式來(lái)實(shí)現(xiàn)一個(gè)對(duì)象緩沖池,減少對(duì)象數(shù)量 ,加速創(chuàng)建速度。這里不再贅述。
8. 代理模式
示例:代理模式
應(yīng)用場(chǎng)景
代理模式就是中介模式。例如我們想要租房,原本租房是發(fā)生在租客和房東之間的事務(wù),但中介的出現(xiàn),雖然會(huì)有一定的費(fèi)用(損耗),但是整個(gè)過(guò)程的推進(jìn)會(huì)更加順利。代理模式,用來(lái)將兩個(gè)比較難以直接溝通的功能主體關(guān)聯(lián)起來(lái),實(shí)現(xiàn)二者交互。
使用須知
和租房找中介一樣,只有在必要的時(shí)候才找,否則就是浪費(fèi)資源,只有在非用不可的時(shí)候才建議使用代理模式。
本質(zhì)
代理模式的本質(zhì)是:
代理模式封裝了溝通所需的所有功能,將兩個(gè)難以直接溝通的功能主體連接起來(lái),起到了橋梁作用。
結(jié)語(yǔ)
結(jié)構(gòu)型模式,就是以功能為核心,研究功能轉(zhuǎn)換、功能調(diào)用、功能組合、功能封裝等各種情形下,將哪些功能封裝到哪些類中,更加高效地實(shí)現(xiàn)需求,提升代碼的可維護(hù)性。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的设计模式(四)结构型模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 年轻人为什么换不动手机了引热议:更注重实
- 下一篇: asp.net连oracle数据库,AS