GOF23種設(shè)計(jì)模式中結(jié)構(gòu)型模式,共七種:
- 適配器模式息裸、
- 裝飾器模式、
- 代理模式幽崩、
- 外觀模式、
- 橋接模式寞钥、
- 組合模式慌申、
- 享元模式。
下面逐一講解:
其他同系列的文章還有:
面向?qū)ο缶幊讨械牧笤瓌t
設(shè)計(jì)模式| 創(chuàng)建型模式
設(shè)計(jì)模式| 結(jié)構(gòu)型模式
設(shè)計(jì)模式| 行為型模式 (上)
設(shè)計(jì)模式| 行為型模式 (下)
歡迎閱讀理郑,評(píng)論L愀取!您炉!
1.適配器模式
不兼容結(jié)構(gòu)的協(xié)調(diào)——適配器模式
適配器模式的作用是解決兩個(gè)對(duì)象間的接口不兼容的問題柒爵。使用適配器模式之后,原本由于接口不兼容而不能工作的兩個(gè)對(duì)象可以一起工作赚爵。
舉個(gè)生活中的例子:港式插頭轉(zhuǎn)換器餐弱,港式的電器插頭比大陸的電器插頭體積要大一些宴霸。如果從香港買了一個(gè) Mac book,
我們會(huì)發(fā)現(xiàn)充電器無法插在家里的插座上膏蚓,為此而改造家里的插座顯然不方便,
所以我們需要一個(gè)轉(zhuǎn)換插頭畸写。
相信在開發(fā)中遇到過這樣的情況:原本兩個(gè)類是毫無聯(lián)系的驮瞧,但是有些時(shí)候我們想讓他們進(jìn)行交互協(xié)作,
當(dāng)然最直接暴力的就是修改各自的源碼枯芬,但沒有源碼呢论笔,
通常適配器模式所涉及的角色包括三種:
目標(biāo)(Target)——客戶端期望使用的接口或類(新接口)
被適配者(Adaptee)——一個(gè)現(xiàn)存需要適配的接口。(舊接口)
適配器(Adapter)——負(fù)責(zé)將Adaptee的接口轉(zhuǎn)換為Target的接口千所。適配器是一個(gè)具體的類狂魔,這是該模式的核心。
1淫痰、適配器模式的使用
A. 適配器必須實(shí)現(xiàn)原有的舊的接口(現(xiàn)有的可利用的接口)最楷。
B. 適配器對(duì)象中持有對(duì)新接口的引用,當(dāng)調(diào)用舊接口時(shí)待错,將這個(gè)調(diào)用委托給實(shí)現(xiàn)新接口的對(duì)象來處理籽孙,也就是在適配器對(duì)象中組合一個(gè)新接口(組合的形式)。
這就是適配器模式的魅力:不改變?cè)薪涌诨鸲恚瑓s還能使用新接口的功能犯建。
2、適配器模式的優(yōu)點(diǎn)
* 通過適配器模式可以讓兩個(gè)原本沒有任何關(guān)系的類能夠在一起協(xié)調(diào)運(yùn)行瓜客,而無需改動(dòng)原來的代碼适瓦,極大的增加了可擴(kuò)展性。
* 將目標(biāo)類和適配者類解耦
* 增加了類的透明性和復(fù)用性谱仪,將具體的實(shí)現(xiàn)封裝在適配者類中玻熙,對(duì)于客戶端類來說是透明的,而且提高了適配者的復(fù)用性芽卿,符合開閉原則
3揭芍、適配器模式的缺點(diǎn)
過多的使用適配器,可能會(huì)導(dǎo)致系統(tǒng)邏輯非常零亂卸例,不易整體進(jìn)行把握称杨,降低代碼的可讀性,
并增加了一些冗余的代碼筷转,如果可以對(duì)系統(tǒng)進(jìn)行重構(gòu)姑原,盡量不要使用使用適配器模式。
如果一定要與外觀呜舒、裝飾者模式嚴(yán)格區(qū)分的話锭汛,
裝飾者模式主要是添加新的功能,而適配器模式主要做的是轉(zhuǎn)換工作。
適配器將一個(gè)對(duì)象包裝起來以改變其接口唤殴,
裝飾者將一個(gè)對(duì)象包裝起來以增加新的行為和責(zé)任般婆,
適配器模式的核心在于“轉(zhuǎn)換”——盡量通過適配器把現(xiàn)有資源轉(zhuǎn)為可用的目標(biāo)資源。
2.裝飾器模式
擴(kuò)展系統(tǒng)功能——裝飾器模式
無論是在現(xiàn)實(shí)生活還是編程世界中朵逝,除了本質(zhì)還需要一些“外飾”才能達(dá)到最好的效果蔚袍。
尤其是在項(xiàng)目開發(fā)過程中,很多業(yè)務(wù)都充滿了很多的不確定性配名,來自業(yè)務(wù)本身啤咽、產(chǎn)品、項(xiàng)目特性的渠脉,
如果一味的使用繼承來擴(kuò)展的話宇整,可能會(huì)相當(dāng)不靈活,今天介紹的裝飾器模式就是多層繼承的替代方案芋膘。
又例如鳞青,某一天小王去度假了,但是他寫的函數(shù)需要增加一些功能索赏,此時(shí)由我接手盼玄,
但是我并不想修改他的源代碼,此時(shí)可以使用裝飾者模式潜腻。裝飾者模式是能夠在不改變對(duì)象自身的基礎(chǔ)上埃儿,
在程序運(yùn)行期間給對(duì)象動(dòng)態(tài)地添加功能。
裝飾模式(Decorator Pattern)是一種常見的結(jié)構(gòu)型模式融涣,又叫包裝模式(Wrapper)童番,又叫包裝器模式(Wrapper),它可以動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé)功能威鹿。
裝飾模式是對(duì)客戶端以透明的方式擴(kuò)展對(duì)象的功能剃斧,是繼承關(guān)系的一個(gè)替代方案。
即對(duì)于客戶端來說并不會(huì)覺得對(duì)象在裝飾前后有何不同忽你,而且裝飾模式可以在不用創(chuàng)造更多子類的情況下將對(duì)象的功能加以擴(kuò)展幼东,
更關(guān)鍵在于這種擴(kuò)展是完全透明的。通常裝飾器模式中會(huì)涉及到兩大類角色——被裝飾對(duì)象和裝飾者科雳,
又可以細(xì)分為四種具體角色:
Component抽象構(gòu)件——定義我們最核心的對(duì)象的一個(gè)接口或者是抽象類根蟹,
即最原始的對(duì)象(必然有一個(gè)最基本、最核心糟秘、最原始的接口或抽象類充當(dāng)Component抽象構(gòu)件)
ConcreteComponent 具體構(gòu)件——定義一個(gè)要被裝飾器裝飾的對(duì)象简逮,Component 的具體實(shí)現(xiàn),即被裝飾者尿赚。
抽象Decorator裝飾角色 ——一般是一個(gè)抽象類(便于根據(jù)不同的裝飾邏輯去實(shí)現(xiàn)其子類)且一定會(huì)持有一個(gè)private變量指向
Component抽象構(gòu)件的引用(它里面不一定只有抽象的方法)維護(hù)對(duì)組件對(duì)象和其子類組件的引用散庶,
但是要注意的是所謂裝飾者僅僅是發(fā)揮錦上添花的作用蕉堰,核心的本質(zhì)功能還是應(yīng)該由構(gòu)件提供,
相當(dāng)于是把在構(gòu)件的基礎(chǔ)上進(jìn)行升級(jí)悲龟,所以需要繼承構(gòu)件
具體裝飾器角色(ConcreteDecorator)——通常是一群子裝飾器組合共同為組件添加新的功能
抽象裝飾器核心代碼
#import "Component.h" //抽象構(gòu)件
@interface Decorator : Component
//裝飾對(duì)象需要裝飾的原始對(duì)象
@property(nonatomic, strong)Component *component;
@end
-(void)operation{
if (self.component) {
[self.component operation];
}
}
1屋讶、裝飾器模式的優(yōu)點(diǎn)
* 雖然裝飾模式與繼承關(guān)系的都是為了要在基類的基礎(chǔ)上擴(kuò)展對(duì)象的功能,
但是裝飾模式可以提供比繼承更多的靈活性躲舌,裝飾模式允許系統(tǒng)動(dòng)態(tài)決定“貼上”或者除掉一個(gè)“裝飾”而不需要改變代碼的層次丑婿;
而繼承關(guān)系是靜態(tài)的,如果想要增加或者減少一個(gè)功能只能通過增加繼承層次或降低層次没卸。
* 使用者可以隨時(shí)根據(jù)具體的業(yè)務(wù)邏輯靈活組織所需要的功能,通過使用不同的具體裝飾類以及這些裝飾類的組合即可
* 裝飾者類可以在被裝飾者的行為前面或后面加上自己的行為秒旋,甚至取代被裝飾者的行為
* 通過使用裝飾器模式约计,我們可以實(shí)現(xiàn)不改變?cè)写a,開放現(xiàn)有代碼的方式來實(shí)現(xiàn)更多的功能迁筛。
* 裝飾類和被裝飾類是可以獨(dú)立發(fā)展且不會(huì)相互耦合煤蚌。即Component類無須知道Decorator類,
Decorator類是從外部來擴(kuò)展Component類的功能细卧,而Decorator也不用知道具體的構(gòu)件尉桩。
2、裝飾器模式的缺點(diǎn)
使用裝飾模式會(huì)產(chǎn)生比使用繼承關(guān)系更多的對(duì)象和復(fù)雜的邏輯贪庙,降低了可讀性蜘犁,
因此,合理使用裝飾類止邮,控制其數(shù)量这橙,以便降低系統(tǒng)的復(fù)雜度
3、裝飾器模式的適用場(chǎng)景及注意事項(xiàng)
在不影響其他對(duì)象的情況下导披,需要以動(dòng)態(tài)屈扎、透明的方式給隨時(shí)給被裝飾對(duì)象添加或者移除某些功能時(shí)而不影響原有邏輯,
想通過靈活組合對(duì)象的方式動(dòng)態(tài)地改變被裝飾對(duì)象的行為
需要擴(kuò)展一個(gè)類的功能或給一個(gè)類增加或隨時(shí)移除附加功能撩匕。
當(dāng)需要以多層次的繼承關(guān)系才能實(shí)現(xiàn)擴(kuò)充時(shí)鹰晨,可以考慮裝飾器模式。
需要為某一類型的兄弟類進(jìn)行改裝或加裝功能止毕,首選裝飾模式模蜡。
3.代理模式
代理模式(Proxy Pattern)又叫委托模式屬于是一個(gè)使用率非常高結(jié)構(gòu)型設(shè)計(jì)模式。
其定義如下:為其他對(duì)象提供一種代理以控制對(duì)這個(gè)對(duì)象的訪問滓技。(Provide a surrogate or placeholder for another object to control access to it.)通俗可以理解成代理就是幫你打理哩牍。你只跟代理一個(gè)人打交到。而不關(guān)心實(shí)際操作的人的具體如何做令漂。代理模式目前框架里用的最多膝昆,
主要作用是程序本身不關(guān)心被代理的身份細(xì)節(jié)丸边。而只關(guān)心它暴露出來的共有行為接口,也可從字面理解就是代理你去執(zhí)行調(diào)用別的類的方法面向被調(diào)用的類荚孵。
1妹窖、代理模式的優(yōu)點(diǎn)
能夠協(xié)調(diào)調(diào)用者和被調(diào)用者,在一定程度上降低了系統(tǒng)的耦合度收叶。
客戶端可以針對(duì)抽象主題角色進(jìn)行編程骄呼,增加和更換代理類無須修改源代碼,符合開閉原則判没,
系統(tǒng)具有較好的靈活性和可擴(kuò)展性蜓萄。
2、適用場(chǎng)景
當(dāng)無法或者不想直接訪問某個(gè)對(duì)象或訪問直接某個(gè)對(duì)象消耗巨大時(shí)澄峰,可以采取通過一個(gè)代理對(duì)象來間接訪問嫉沽,
為了保持對(duì)客戶端透明,代理對(duì)象和被代理對(duì)象需要實(shí)現(xiàn)相同的接口俏竞。
4.外觀模式
外觀模式:為子系統(tǒng)中的一組接口提供一個(gè)統(tǒng)一的入口绸硕。外觀模式定義了一個(gè)高層接口,這個(gè)接口使得這一子系統(tǒng)更加容易使用魂毁。
外觀模式中玻佩,一個(gè)子系統(tǒng)的外部與其內(nèi)部的通信通過一個(gè)統(tǒng)一的外觀類進(jìn)行,外觀類將客戶類與子系統(tǒng)的內(nèi)部復(fù)雜性分隔開席楚,使得客戶類只需要與外觀角色打交道咬崔,而不需要與子系統(tǒng)內(nèi)部的很多對(duì)象打交道。
外觀模式是一種使用頻率非常高的結(jié)構(gòu)型設(shè)計(jì)模式酣胀,它通過引入一個(gè)外觀角色來簡(jiǎn)化客戶端與子系統(tǒng)之間的交互刁赦,
為復(fù)雜的子系統(tǒng)調(diào)用提供一個(gè)統(tǒng)一的入口,降低子系統(tǒng)與客戶端的耦合度闻镶,且客戶端調(diào)用非常方便甚脉。
外觀模式又稱為門面模式,它是一種對(duì)象結(jié)構(gòu)型模式铆农。外觀模式是迪米特法則的一種具體實(shí)現(xiàn)牺氨,
通過引入一個(gè)新的外觀角色可以降低原有系統(tǒng)的復(fù)雜度,同時(shí)降低客戶類與子系統(tǒng)的耦合度墩剖。
外觀模式概述
不知道大家有沒有比較過自己泡茶和去茶館喝茶的區(qū)別猴凹,如果是自己泡茶需要自行準(zhǔn)備茶葉、茶具和開水岭皂,如圖1(A)所示郊霎,
而去茶館喝茶,最簡(jiǎn)單的方式就是跟茶館服務(wù)員說想要一杯什么樣的茶爷绘,是鐵觀音书劝、碧螺春還是西湖龍井进倍?正因?yàn)椴桊^有服務(wù)員,
顧客無須直接和茶葉购对、茶具猾昆、開水等交互,整個(gè)泡茶過程由服務(wù)員來完成骡苞,顧客只需與服務(wù)員交互即可垂蜗,整個(gè)過程非常簡(jiǎn)單省事,
如圖1(B)所示解幽。
在軟件開發(fā)中贴见,有時(shí)候?yàn)榱送瓿梢豁?xiàng)較為復(fù)雜的功能,一個(gè)客戶類需要和多個(gè)業(yè)務(wù)類交互躲株,而這些需要交互的業(yè)務(wù)類經(jīng)常會(huì)作為一個(gè)整體出
現(xiàn)蝇刀,由于涉及到的類比較多,導(dǎo)致使用時(shí)代碼較為復(fù)雜徘溢,此時(shí),特別需要一個(gè)類似服務(wù)員一樣的角色捆探,
由它來負(fù)責(zé)和多個(gè)業(yè)務(wù)類進(jìn)行交互然爆,而客戶類只需與該類交互。
外觀模式通過引入一個(gè)新的外觀類(Facade)來實(shí)現(xiàn)該功能黍图,外觀類充當(dāng)了軟件系統(tǒng)中的“服務(wù)員”曾雕,
它為多個(gè)業(yè)務(wù)類的調(diào)用提供了一個(gè)統(tǒng)一的入口,簡(jiǎn)化了類與類之間的交互助被。
在外觀模式中剖张,那些需要交互的業(yè)務(wù)類被稱為子系統(tǒng)(Subsystem)。如果沒有外觀類揩环,
那么每個(gè)客戶類需要和多個(gè)子系統(tǒng)之間進(jìn)行復(fù)雜的交互搔弄,系統(tǒng)的耦合度將很大,如圖2(A)所示丰滑;
而引入外觀類之后顾犹,客戶類只需要直接與外觀類交互,客戶類與子系統(tǒng)之間原有的復(fù)雜引用關(guān)系由外觀類來實(shí)現(xiàn)褒墨,從而降低了系統(tǒng)的耦合度
如圖2(B)所示炫刷。
5.橋接模式
處理多維度變化-橋接模式
在正式介紹橋接模式之前,我先跟大家談?wù)剝煞N常見文具的區(qū)別郁妈,它們是毛筆和蠟筆浑玛。
假如我們需要大中小3種型號(hào)的畫筆,能夠繪制12種不同的顏色噩咪,
如果使用蠟筆顾彰,需要準(zhǔn)備3×12 = 36支极阅,
但如果使用毛筆的話,只需要提供3種型號(hào)的毛筆拘央,外加12個(gè)顏料盒即可涂屁,涉及到的對(duì)象個(gè)數(shù)僅為 3 + 12 = 15,遠(yuǎn)小于36灰伟,
卻能實(shí)現(xiàn)與36支蠟筆同樣的功能拆又。
如果增加一種新型號(hào)的畫筆,并且也需要具有12種顏色栏账,對(duì)應(yīng)的蠟筆需增加12支帖族,而毛筆只需增加一支。為什么會(huì)這樣呢挡爵?
通過分析我們可以得知:在蠟筆中竖般,顏色和型號(hào)兩個(gè)不同的變化維度(即兩個(gè)不同的變化原因)融合在一起,
無論是對(duì)顏色進(jìn)行擴(kuò)展還是對(duì)型號(hào)進(jìn)行擴(kuò)展都勢(shì)必會(huì)影響另一個(gè)維度茶鹃;但在毛筆中涣雕,顏色和型號(hào)實(shí)現(xiàn)了分離,
增加新的顏色或者型號(hào)對(duì)另一方都沒有任何影響闭翩。如果使用軟件工程中的術(shù)語挣郭,我們可以認(rèn)為在蠟筆中顏色和型號(hào)之間存在較強(qiáng)的耦合性,
而毛筆很好地將二者解耦疗韵,使用起來非常靈活兑障,擴(kuò)展也更為方便。
在軟件開發(fā)中蕉汪,我們也提供了一種設(shè)計(jì)模式來處理與畫筆類似的具有多變化維度的情況流译,即本章將要介紹的橋接模式。
橋接模式是一種很實(shí)用的結(jié)構(gòu)型設(shè)計(jì)模式者疤,如果軟件系統(tǒng)中某個(gè)類存在兩個(gè)獨(dú)立變化的維度福澡,通過該模式可以將這兩個(gè)維度分離出來,使兩者可以獨(dú)立擴(kuò)展宛渐,讓系統(tǒng)更加符合“單一職責(zé)原則”竞漾。與多層繼承方案不同,它將兩個(gè)獨(dú)立變化的維度設(shè)計(jì)為兩個(gè)獨(dú)立的繼承等級(jí)結(jié)構(gòu)窥翩,并且在抽象層建立一個(gè)抽象關(guān)聯(lián)业岁,該關(guān)聯(lián)關(guān)系類似一條連接兩個(gè)獨(dú)立繼承結(jié)構(gòu)的橋,故名橋接模式寇蚊。
橋接模式用一種巧妙的方式處理多層繼承存在的問題笔时,
用抽象關(guān)聯(lián)取代了傳統(tǒng)的多層繼承,將類之間的靜態(tài)繼承關(guān)系轉(zhuǎn)換為動(dòng)態(tài)的對(duì)象組合關(guān)系仗岸,
使得系統(tǒng)更加靈活允耿,并易于擴(kuò)展借笙,同時(shí)有效控制了系統(tǒng)中類的個(gè)數(shù)。
橋接定義如下:
橋接模式(Bridge Pattern):將抽象部分與它的實(shí)現(xiàn)部分分離较锡,使它們都可以獨(dú)立地變化业稼。它是一種對(duì)象結(jié)構(gòu)型模式,
又稱為柄體(Handle and Body)模式或接口(Interface)模式蚂蕴。
橋接模式的結(jié)構(gòu)與其名稱一樣低散,存在一條連接兩個(gè)繼承等級(jí)結(jié)構(gòu)的橋。
橋接模式是一個(gè)非常有用的模式骡楼,在橋接模式中體現(xiàn)了很多面向?qū)ο笤O(shè)計(jì)原則的思想熔号,包括“單一職責(zé)原則”、“開閉原則”鸟整、“合成復(fù)用原則”引镊、“里氏代換原則”、“依賴倒轉(zhuǎn)原則”等篮条。熟悉橋接模式有助于我們深入理解這些設(shè)計(jì)原則弟头,也有助于我們形成正確的設(shè)計(jì)思想和培養(yǎng)良好的設(shè)計(jì)風(fēng)格。
在使用橋接模式時(shí)涉茧,我們首先應(yīng)該識(shí)別出一個(gè)類所具有的兩個(gè)獨(dú)立變化的維度亮瓷,
將它們?cè)O(shè)計(jì)為兩個(gè)獨(dú)立的繼承等級(jí)結(jié)構(gòu),為兩個(gè)維度都提供抽象層降瞳,并建立抽象耦合。
通常情況下蚓胸,我們將具有兩個(gè)獨(dú)立變化維度的類的一些普通業(yè)務(wù)方法和與之關(guān)系最密切的維度設(shè)計(jì)為“抽象類”層次結(jié)構(gòu)(抽象部分)挣饥,
而將另一個(gè)維度設(shè)計(jì)為“實(shí)現(xiàn)類”層次結(jié)構(gòu)(實(shí)現(xiàn)部分)。
例如:對(duì)于毛筆而言沛膳,由于型號(hào)是其固有的維度扔枫,因此可以設(shè)計(jì)一個(gè)抽象的毛筆類,
在該類中聲明并部分實(shí)現(xiàn)毛筆的業(yè)務(wù)方法锹安,而將各種型號(hào)的毛筆作為其子類短荐;
顏色是毛筆的另一個(gè)維度,由于它與毛筆之間存在一種“設(shè)置”的關(guān)系叹哭,
因此我們可以提供一個(gè)抽象的顏色接口忍宋,而將具體的顏色作為實(shí)現(xiàn)該接口的子類。
在此风罩,型號(hào)可認(rèn)為是毛筆的抽象部分糠排,而顏色是毛筆的實(shí)現(xiàn)部分,
結(jié)構(gòu)示意圖如下:
在上圖中超升,如果需要增加一種新型號(hào)的毛筆入宦,只需擴(kuò)展左側(cè)的“抽象部分”哺徊,
增加一個(gè)新的擴(kuò)充抽象類;如果需要增加一種新的顏色乾闰,只需擴(kuò)展右側(cè)的“實(shí)現(xiàn)部分”落追,
增加一個(gè)新的具體實(shí)現(xiàn)類。擴(kuò)展非常方便涯肩,無須修改已有代碼轿钠,且不會(huì)導(dǎo)致類的數(shù)目增長(zhǎng)過快。
對(duì)于客戶端而言宽菜,可以針對(duì)兩個(gè)維度的抽象層編程谣膳,在程序運(yùn)行時(shí)再動(dòng)態(tài)確定兩個(gè)維度的子類,動(dòng)態(tài)組合對(duì)象铅乡,將兩個(gè)獨(dú)立變化的維度完全解耦继谚,以便能夠靈活地?cái)U(kuò)充任一維度而對(duì)另一維度不造成任何影響。
6. 組合模式
樹形結(jié)構(gòu)的處理——組合模式
樹形結(jié)構(gòu)在軟件中隨處可見阵幸,例如操作系統(tǒng)中的目錄結(jié)構(gòu)花履、應(yīng)用軟件中的菜單、辦公系統(tǒng)中的公司組織結(jié)構(gòu)等等挚赊,
如何運(yùn)用面向?qū)ο蟮姆绞絹硖幚磉@種樹形結(jié)構(gòu)是組合模式需要解決的問題诡壁,
組合模式通過一種巧妙的設(shè)計(jì)方案使得用戶可以一致性地處理整個(gè)樹形結(jié)構(gòu)或者樹形結(jié)構(gòu)的一部分,
也可以一致性地處理樹形結(jié)構(gòu)中的葉子節(jié)點(diǎn)(不包含子節(jié)點(diǎn)的節(jié)點(diǎn))和容器節(jié)點(diǎn)(包含子節(jié)點(diǎn)的節(jié)點(diǎn))荠割。
1妹卿、什么是組合模式
組合模式,將對(duì)象組合成樹形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu)蔑鹦,組合模式使得用戶對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性夺克。
組合模式是對(duì)樹型數(shù)據(jù)結(jié)構(gòu)的一種實(shí)現(xiàn),組合模式主要由兩個(gè)角色組成
- 枝結(jié)點(diǎn)
- 葉結(jié)點(diǎn)
所有的組合模式都是由一個(gè)根節(jié)點(diǎn)擴(kuò)展出來的嚎朽,每個(gè)枝結(jié)點(diǎn)都可以擴(kuò)展出枝結(jié)點(diǎn)和葉結(jié)點(diǎn)铺纽。葉結(jié)點(diǎn)表示這條分支的終點(diǎn),無法擴(kuò)展哟忍。
iOS 中的 View 就是一個(gè)標(biāo)準(zhǔn)的組合模式狡门。
- 組合模式的主要優(yōu)點(diǎn)如下:
(1) 組合模式可以清楚地定義分層次的復(fù)雜對(duì)象,表示對(duì)象的全部或部分層次锅很,它讓客戶端忽略了層次的差異其馏,
方便對(duì)整個(gè)層次結(jié)構(gòu)進(jìn)行控制。
(2) 客戶端可以一致地使用一個(gè)組合結(jié)構(gòu)或其中單個(gè)對(duì)象爆安,不必關(guān)心處理的是單個(gè)對(duì)象還是整個(gè)組合結(jié)構(gòu)尝偎,簡(jiǎn)化了客戶端代碼。
(3) 在組合模式中增加新的容器構(gòu)件和葉子構(gòu)件都很方便,無須對(duì)現(xiàn)有類庫(kù)進(jìn)行任何修改致扯,符合“開閉原則”肤寝。
(4) 組合模式為樹形結(jié)構(gòu)的面向?qū)ο髮?shí)現(xiàn)提供了一種靈活的解決方案,通過葉子對(duì)象和容器對(duì)象的遞歸組合抖僵,
可以形成復(fù)雜的樹形結(jié)構(gòu)鲤看,但對(duì)樹形結(jié)構(gòu)的控制卻非常簡(jiǎn)單。
3.在以下情況下可以考慮使用組合模式:
(1) 在具有整體和部分的層次結(jié)構(gòu)中耍群,希望通過一種方式忽略整體與部分的差異义桂,客戶端可以一致地對(duì)待它們。
(2) 在一個(gè)使用面向?qū)ο笳Z言開發(fā)的系統(tǒng)中需要處理一個(gè)樹形結(jié)構(gòu)蹈垢。
(3) 在一個(gè)系統(tǒng)中能夠分離出葉子對(duì)象和容器對(duì)象慷吊,而且它們的類型不固定,需要增加一些新的類型曹抬。
7. 享元模式-
實(shí)現(xiàn)對(duì)象的復(fù)用- 享元模式
定義:享元模式是 一種 可共享 對(duì)象的一種設(shè)計(jì)模式溉瓶。在需要使用大量的細(xì)粒度 對(duì)象的過程中。這種模式 能很大的減少內(nèi)存和提升性能谤民。
所謂 細(xì)粒度,就是對(duì)象相近 而且 數(shù)量很多堰酿。 我們把這些對(duì)象 分成 內(nèi)部狀態(tài) 和 外部狀態(tài)。
內(nèi)部狀態(tài) 只使用一個(gè)對(duì)象來共享 张足。
外部狀態(tài) 不能共享出來,是對(duì)象區(qū)分的触创。
大體實(shí)現(xiàn):
實(shí)現(xiàn)享元模式需要兩個(gè)關(guān)鍵組件,通常是可共享的享元對(duì)象和保存他們的池。某種中央對(duì)象維護(hù)這個(gè)池,并從它返回適當(dāng)?shù)膶?shí)例为牍。
在iOS開發(fā)中,大家肯定都用過UITableViewCell,UICollectionViewCell,
這兩個(gè)類在使用過程中就使用了享元模式,工作原理基本就是:利用重用池重用思想,
創(chuàng)建頁面可顯示的cell個(gè)數(shù)的對(duì)象,在頁面滾動(dòng)過程中監(jiān)聽每個(gè)cell的狀態(tài),從頁面消失的cell被放回重用池,
將要顯示的cell先去重用池中去取,如果可以取到,則繼續(xù)使用這個(gè)cell,如果沒有多余的cell,就重新創(chuàng)建新的,
這樣即使你有100條數(shù)據(jù),也僅僅只會(huì)創(chuàng)建頁面可顯示個(gè)數(shù)的cell對(duì)象,
這樣就大大減少了對(duì)象的創(chuàng)建,實(shí)現(xiàn)了大量?jī)?nèi)存占用,導(dǎo)致內(nèi)存泄露的問題
1.主要優(yōu)點(diǎn)
享元模式的主要優(yōu)點(diǎn)如下:
(1) 可以極大減少內(nèi)存中對(duì)象的數(shù)量哼绑,使得相同或相似對(duì)象在內(nèi)存中只保存一份,從而可以節(jié)約系統(tǒng)資源碉咆,提高系統(tǒng)性能凌那。
(2) 享元模式的外部狀態(tài)相對(duì)獨(dú)立,而且不會(huì)影響其內(nèi)部狀態(tài)吟逝,從而使得享元對(duì)象可以在不同的環(huán)境中被共享。
2.主要缺點(diǎn)
享元模式的主要缺點(diǎn)如下:
(1) 享元模式使得系統(tǒng)變得復(fù)雜赦肋,需要分離出內(nèi)部狀態(tài)和外部狀態(tài)块攒,這使得程序的邏輯復(fù)雜化。
(2) 為了使對(duì)象可以共享佃乘,享元模式需要將享元對(duì)象的部分狀態(tài)外部化囱井,而讀取外部狀態(tài)將使得運(yùn)行時(shí)間變長(zhǎng)。
3.適用場(chǎng)景
在以下情況下可以考慮使用享元模式:
(1) 一個(gè)系統(tǒng)有大量相同或者相似的對(duì)象趣避,造成內(nèi)存的大量耗費(fèi)庞呕。
(2) 對(duì)象的大部分狀態(tài)都可以外部化,可以將這些外部狀態(tài)傳入對(duì)象中。
(3) 在使用享元模式時(shí)需要維護(hù)一個(gè)存儲(chǔ)享元對(duì)象的享元池住练,而這需要耗費(fèi)一定的系統(tǒng)資源地啰,因此,
應(yīng)當(dāng)在需要多次重復(fù)使用享元對(duì)象時(shí)才值得使用享元模式讲逛。
<后續(xù)會(huì)持續(xù)更新>