iOS常用設(shè)計(jì)模式總結(jié)(一)
設(shè)計(jì)模式大概分成三類(lèi):
1.創(chuàng)建型:?jiǎn)卫O(shè)計(jì)模式错森、抽象工廠設(shè)計(jì)模式
2.結(jié)構(gòu)型:MVC 模式、裝飾器模式篮洁、適配器模式涩维、外觀模式、組合模式
3.行為型:責(zé)任鏈設(shè)計(jì)模式嘀粱、觀察者設(shè)計(jì)模式激挪,備忘錄設(shè)計(jì)模式、命令設(shè)計(jì)模式
MVC模式:
涉及到的三個(gè)角色如下:
Model:
模型保存應(yīng)用程序的數(shù)據(jù)锋叨,定義了怎么去操作它垄分。例如在本應(yīng)用中模型就是Album類(lèi)。
View:
視圖是模型的可視化表示以及用戶(hù)交互的控件娃磺;基本上來(lái)說(shuō)薄湿,所有的UIView對(duì)象以及它的子類(lèi)都屬于視圖。在本應(yīng)用中AlbumView代表了視圖偷卧。
Controller:
控制器是一個(gè)協(xié)調(diào)所有工作的中介者(Mediator)豺瘤。它訪問(wèn)模型中的數(shù)據(jù)并在視圖中展示它們,同時(shí)它們還監(jiān)聽(tīng)事件和根據(jù)需要操作數(shù)據(jù)听诸。你可以猜猜哪個(gè)類(lèi)是控制器嗎坐求?它正是:ViewController。
MVC遵循以下的原則:
在理想的狀態(tài)下晌梨,視圖應(yīng)該和模型完全的分離桥嗤。如果視圖不依賴(lài)某個(gè)實(shí)際的模型,那么視圖就可以被復(fù)用來(lái)展示不同模型的數(shù)據(jù)仔蝌。
單例設(shè)計(jì)模式有如下特點(diǎn):
1.單例設(shè)計(jì)模式確保對(duì)于一個(gè)給定的類(lèi)只有一個(gè)實(shí)例存在泛领,這個(gè)實(shí)例有一個(gè)全局唯一的訪問(wèn)點(diǎn)。
2.它通常采用延遲加載的方式在第一次用到實(shí)例的時(shí)候再去創(chuàng)建它敛惊。
[NSUserDefaults standardUserDefaults], [UIApplication sharedApplication], [UIScreen mainScreen], [NSFileManager defaultManager]渊鞋,所有的這些方法都返回一個(gè)單例對(duì)象
單例模式實(shí)現(xiàn)步驟:
1.聲明一個(gè)靜態(tài)變量去保存類(lèi)的實(shí)例,確保它在類(lèi)中的全局可用性瞧挤。
2.聲明一個(gè)靜態(tài)變量dispatch_once_t ,它確保初始化器代碼只執(zhí)行一次
3.使用Grand Central Dispatch(GCD)執(zhí)行初始化LibraryAPI變量的block.這 正是單例模式的關(guān)鍵:一旦類(lèi)已經(jīng)被初始化锡宋,初始化器永遠(yuǎn)不會(huì)再被調(diào)用。
下一次你調(diào)用sharedInstance的時(shí)候特恬,dispatch_once塊中的代碼將不會(huì)執(zhí)行(因?yàn)樗呀?jīng)被執(zhí)行了一次)员辩,你將得到原先已經(jīng)初始化好的實(shí)例。
外觀模式Facade:
特點(diǎn):
- 外觀模式針對(duì)復(fù)雜的子系統(tǒng)提供了單一的接口鸵鸥,不需要暴漏一些列的類(lèi)和API給用戶(hù),你僅僅暴漏一個(gè)簡(jiǎn)單統(tǒng)一的API。
2.使用者完全不需要關(guān)心背后的復(fù)雜性妒穴。這個(gè)模式非常適合有一大堆很難使用或者理解的類(lèi)的情況宋税。
3.外觀模式解耦了使用系統(tǒng)的代碼和需要隱藏的接口和實(shí)現(xiàn)類(lèi)。它也降低了外部代碼對(duì)內(nèi)部子系統(tǒng)的依賴(lài)性讼油。當(dāng)隱藏在門(mén)面之后的類(lèi)很容易發(fā)生變化的時(shí)候杰赛,此模式就很有用了,因?yàn)楫?dāng)背后的類(lèi)發(fā)生變化的時(shí)候矮台,門(mén)面類(lèi)始終保持了同樣的API乏屯。
應(yīng)用場(chǎng)景:
假如某個(gè)模塊需要對(duì)一些數(shù)據(jù)做展示,這些數(shù)據(jù)的來(lái)源可能是不同數(shù)據(jù)庫(kù)瘦赫、可能是通過(guò)網(wǎng)絡(luò)請(qǐng)求返回辰晕,總之載入數(shù)據(jù)的過(guò)程及其復(fù)雜,這時(shí)候可以合理運(yùn)用外觀模式确虱,封裝復(fù)雜的數(shù)據(jù)加載處理過(guò)程含友,對(duì)外公開(kāi)簡(jiǎn)單的接口返回?cái)?shù)據(jù)。
裝飾器(Decorator)模式
裝飾器模式在不修改原來(lái)代碼的情況下動(dòng)態(tài)的給對(duì)象(而不是類(lèi))增加新的行為和職責(zé)校辩,它通過(guò)一個(gè)對(duì)象包裝被裝飾對(duì)象的方法來(lái)修改類(lèi)的行為窘问,這種方法可以做為子類(lèi)化的一種替代方法。相對(duì)而言這種方式比子類(lèi)繼承更為靈活宜咒。
在Objective-C中惠赫,存在兩種非常常見(jiàn)的實(shí)現(xiàn):Category(類(lèi)別)和Delegation(委托)。
注意:如果方法與原來(lái)類(lèi)的方法重名了故黑,或者與同樣的類(lèi)(甚至它的父類(lèi))的其它的擴(kuò)展重名儿咱,那么運(yùn)行期到底應(yīng)該調(diào)用哪個(gè)方法是未定義的。當(dāng)你僅僅是在擴(kuò)展你自己寫(xiě)的類(lèi)時(shí)倍阐,這沒(méi)什么問(wèn)題概疆, 但是當(dāng)你在擴(kuò)展標(biāo)準(zhǔn)的Cocoa 或者Cocoa Touch類(lèi)的時(shí)候,它可能會(huì)導(dǎo)致嚴(yán)重的問(wèn)題峰搪。
簡(jiǎn)單工廠模式
初衷:在某個(gè)模塊中岔冀,如果有大量的分配(new)釋放(delete)某些對(duì)象操作。
這類(lèi)操作如果過(guò)多概耻,分散在各處使套,這樣會(huì)非常難以管理,代碼將會(huì)很亂鞠柄,維護(hù)起來(lái)也很困難侦高。
new操作經(jīng)常要對(duì)應(yīng)編寫(xiě)一些異常處理代碼,這時(shí)編碼變得極其混亂和臃腫厌杜。
在這種情況下奉呛,要解決這些問(wèn)題计螺,我們需要一個(gè)新的類(lèi)。專(zhuān)門(mén)從事對(duì)象的建立和釋放瞧壮,之后登馒,對(duì)象的各種操作,與這個(gè)類(lèi)就不再有任何關(guān)系咆槽。
這個(gè)類(lèi)即是工廠類(lèi)陈轿,專(zhuān)門(mén)用于創(chuàng)建對(duì)象,向外暴露創(chuàng)建對(duì)象的接口秦忿,供外部調(diào)用麦射。
工廠模式有一種非常形象的描述,建立對(duì)象的類(lèi)就如一個(gè)工廠灯谣,而需要被建立的對(duì)象就是一個(gè)個(gè)產(chǎn)品潜秋;在工廠中加工產(chǎn)品,使用產(chǎn)品的人酬屉,
不用在乎產(chǎn)品是如何生產(chǎn)出來(lái)的半等。從軟件開(kāi)發(fā)的角度來(lái)說(shuō),這樣就有效的降低了模塊之間的耦合呐萨。
簡(jiǎn)單工廠模式示意圖:
簡(jiǎn)單工廠模式有以下弱點(diǎn):
1.如果要新增一個(gè)產(chǎn)品杀饵,這樣必須在代碼層次增加產(chǎn)品類(lèi)別,不具有自動(dòng)擴(kuò)展的靈活性谬擦。而頻繁多次修改曾經(jīng)已經(jīng)測(cè)試過(guò)的代碼切距,在項(xiàng)目開(kāi)發(fā)中是很忌諱的事情。
工廠方法模式
為了解決上述簡(jiǎn)單工廠模式的弱點(diǎn)惨远,出現(xiàn)了工廠方法模式
簡(jiǎn)單說(shuō)谜悟,工廠方法模式,就是針對(duì)不同的產(chǎn)品北秽,使用不同的工廠類(lèi)創(chuàng)建不同的工廠對(duì)象然后生產(chǎn)不同的產(chǎn)品葡幸。
也就是一個(gè)工廠類(lèi)對(duì)應(yīng)一類(lèi)產(chǎn)品。
這樣需要新建一類(lèi)產(chǎn)品的時(shí)候贺氓,需要新建一個(gè)工廠類(lèi)蔚叨,同時(shí)對(duì)應(yīng)擴(kuò)展一個(gè)產(chǎn)品類(lèi)
這種設(shè)計(jì)模式的缺點(diǎn)也是顯而易見(jiàn)的:
1.每新增一個(gè)產(chǎn)品類(lèi),對(duì)應(yīng)就要新建一個(gè)工廠類(lèi)辙培,如果產(chǎn)品比較多蔑水,必然會(huì)分配大量的工廠對(duì)象,這樣維護(hù)的成本勢(shì)必會(huì)增加扬蕊。
2.既然每個(gè)產(chǎn)品的工廠類(lèi)都徹底分開(kāi)獨(dú)立搀别,這樣某些可以復(fù)用的代碼塊將無(wú)法復(fù)用。
工廠方法模式:
為了解決工廠方法模式的上述缺陷尾抑,出現(xiàn)了抽象工廠模式
抽象工廠模式在一定的程度上借鑒了簡(jiǎn)單工廠模式和工廠方法模式的優(yōu)點(diǎn)歇父,同時(shí)抑制了其缺點(diǎn)蒂培。
簡(jiǎn)單說(shuō),抽象工廠在一定程度上對(duì)具有共性產(chǎn)品做了歸類(lèi)庶骄,并對(duì)應(yīng)實(shí)現(xiàn)了生產(chǎn)該類(lèi)產(chǎn)品工廠類(lèi)毁渗。
此時(shí)的工廠類(lèi)與工廠方法模式下的工廠類(lèi)的主要區(qū)別在于,這種工廠類(lèi)并不局限于創(chuàng)建某個(gè)特定類(lèi)的產(chǎn)品单刁,而是根據(jù)需要可以創(chuàng)建具體類(lèi)型不同的產(chǎn)品。
抽象工廠模式示意圖:
工廠模式總結(jié):
應(yīng)用場(chǎng)景:
1.在設(shè)計(jì)的初期府适,就考慮到產(chǎn)品在后期會(huì)進(jìn)行大規(guī)模擴(kuò)展的情況下羔飞,應(yīng)當(dāng)使用工廠方法模式;
2.產(chǎn)品結(jié)構(gòu)較復(fù)雜的情況下檐春,建議使用工廠方法模式逻淌;
3.工廠方法模式適用于產(chǎn)品種類(lèi)結(jié)構(gòu)單一的場(chǎng)合,為一類(lèi)產(chǎn)品提供創(chuàng)建的接口疟暖;
4.而抽象工廠方法適用于產(chǎn)品種類(lèi)結(jié)構(gòu)多的場(chǎng)合卡儒,主要用于創(chuàng)建一組(有多個(gè)種類(lèi))相關(guān)的產(chǎn)品,為它們提供創(chuàng)建的接口俐巴;就是當(dāng)具有多個(gè)抽象角色時(shí)骨望,抽象工廠便可以派上用場(chǎng)。
5.至于簡(jiǎn)單工廠模式欣舵,適合類(lèi)型單一擎鸠,但是多個(gè)場(chǎng)合下頻繁創(chuàng)建銷(xiāo)毀的情況,當(dāng)后期需要大規(guī)模擴(kuò)展時(shí)缘圈,不適宜使用簡(jiǎn)單工廠模式劣光。