在軟件開發(fā)中顾瞻,無論是那種高級語言中總會伴隨著一些最為常用的設(shè)計模式,下面針對iOS中德绿,MVC模式荷荤、代理模式、觀察者模式移稳、單例模式蕴纳、策略模式、簡單工廠模式這六大模式進行匯總分析个粱。
一古毛、MVC模式
MVC是一種軟件設(shè)計典范,用一種業(yè)務(wù)邏輯都许、數(shù)據(jù)稻薇、界面顯示分離的方法組織代碼,將業(yè)務(wù)邏輯聚集到一個部件里面梭稚,在改進和個性化定制界面及用戶交互的同時颖低,不需要重新編寫業(yè)務(wù)邏輯
1.1實例
MVC(Model View Controller)模型(model)-視圖(view)-控制器(controller)
1.1.1模型對象
模型對象封裝了應(yīng)用程序的數(shù)據(jù),并定義操控和處理該數(shù)據(jù)的邏輯和運算弧烤。
例如忱屑,模型對象可能是表示游戲中的角色或地址簿中的聯(lián)系人蹬敲。
用戶在視圖層中所進行的創(chuàng)建或修改數(shù)據(jù)的操作,通過控制器對象傳達出去莺戒,最終會創(chuàng)建或更新模型對象伴嗡。
模型對象更改時(例如通過網(wǎng)絡(luò)連接接收到新數(shù)據(jù)),它通知控制器對象从铲,控制器對象更新相應(yīng)的視圖對象瘪校。
1.1.2視圖對象
視圖對象是應(yīng)用程序中用戶可以看見的對象,視圖對象知道如何將自己繪制出來名段,并可能對用戶的操作作出響應(yīng)阱扬。
視圖對象的主要目的,就是顯示來自應(yīng)用程序模型對象的數(shù)據(jù)伸辟,并使該數(shù)據(jù)可被編輯麻惶。
盡管如此,在 MVC 應(yīng)用程序中信夫,視圖對象通常與模型對象分離窃蹋。
在iOS應(yīng)用程序開發(fā)中,所有的控件静稻、窗口等都繼承自 UIView警没,對應(yīng)MVC中的V。UIView及其子類主要負責UI的實現(xiàn)振湾,而UIView所產(chǎn)生的事件都可以采用委托的方式杀迹,交給UIViewController實現(xiàn)。
1.1.3控制器對象
在應(yīng)用程序的一個或多個視圖對象和一個或多個模型對象之間恰梢,控制器對象充當媒介佛南。控制器對象因此是同步管道程序嵌言,通過它嗅回,視圖對象了解模型對象的更改,反之亦然摧茴∶嘣兀控制器對象還可以為應(yīng)用程序執(zhí)行設(shè)置和協(xié)調(diào)任務(wù),并管理其他對象的生命周期苛白。
1.2應(yīng)用場景
MVC模式是一中非常古老的設(shè)計模式娃豹,通過數(shù)據(jù)模型,控制器邏輯购裙,視圖展示將應(yīng)用程序進行邏輯劃分懂版。
1.3優(yōu)勢
MVC模式使系統(tǒng),層次清晰躏率,職責分明躯畴,易于維護
1.4敏捷原則
MVC模式對擴展開放-對修改封閉
二民鼓、代理模式
代理模式完成委托方交給的任務(wù),委托方有一些任務(wù)自己不想完成,但是還需要要實現(xiàn),則將該任務(wù)存放到協(xié)議中,由代理完成.但是代理并不會主動的執(zhí)行任務(wù),需要委托方通知代理。
2.1應(yīng)用場景
當一個類的某些功能需要由別的類來實現(xiàn)蓬抄,但是又不確定具體會是哪個類實現(xiàn)丰嘉。
2.2優(yōu)勢
解耦合
2.3敏捷原則
開放-封閉原則
2.4實例
tableview的 數(shù)據(jù)源delegate,通過和protocol的配合嚷缭,完成委托訴求饮亏。列表row個數(shù)delegate,自定義的delegate阅爽。
三路幸、觀察者模式
觀察者模式本質(zhì)上是一種發(fā)布-訂閱模型,用以消除具有不同行為的對象之間的耦合,通過這一模式付翁,不同對象可以協(xié)同工作劝赔,同時它們也可以被復(fù)用于其他地方Observer從Subject訂閱通知,ConcreteObserver實現(xiàn)重現(xiàn)ObServer并將其重載其update方法胆敞。
3.1應(yīng)用場景
一般為model層對,controller和view進行的通知方式杂伟,不關(guān)心誰去接收移层,只負責發(fā)布信息。
3.2優(yōu)勢
解耦合
3.3敏捷原則
接口隔離原則赫粥,開放-封閉原則
3.4實例
Notification通知中心观话,注冊通知中心,任何位置可以發(fā)送消息越平,注冊觀察者的對象可以接收频蛔。
kvo,鍵值對改變通知的觀察者秦叛,平時基本沒用過晦溪。
四、單例模式
單例模式可以保證App在程序運行中挣跋,一個類只有唯一個實例三圆,從而做到節(jié)約內(nèi)存。
在整個App程序中避咆,這一份資源是共享的舟肉。
提供一個固定的實例創(chuàng)建方法。
4.1應(yīng)用場景
確保程序運行期某個類查库,只有一份實例路媚,用于進行資源共享控制。
4.2優(yōu)勢
使用簡單樊销,延時求值整慎,易于跨模塊
4.3敏捷原則
單一職責原則
4.4實例
[UIApplication sharedApplication]脏款。
4.5注意事項
確保使用者只能通過 getInstance方法才能獲得,單例類的唯一實例院领。
java弛矛,C++中使其沒有公有構(gòu)造函數(shù),私有化并覆蓋其構(gòu)造函數(shù)比然。
object c中丈氓,重寫allocWithZone方法,保證即使用戶用 alloc方法直接創(chuàng)建單例類的實例强法,
返回的也只是此單例類的唯一靜態(tài)變量万俗。
五、策略模式
策略模式定義了一系列的算法饮怯,并將每一個算法封裝起來闰歪,而且使它們還可以相互替換。策略模式讓算法獨立于使用它的客戶而獨立變化蓖墅。
5.1應(yīng)用場景
定義算法族库倘,封裝起來,使他們之間可以相互替換论矾。
5.2優(yōu)勢
使算法的變化獨立于使用算法的用戶
5.3敏捷原則
接口隔離原則教翩;
多用組合,少用繼承贪壳;
針對接口編程饱亿,而非實現(xiàn)。
5.4實例
排序算法闰靴,NSArray的sortedArrayUsingSelector彪笼;經(jīng)典的鴨子會叫,會飛案例蚂且。
5.5注意事項
1配猫、剝離類中易于變化的行為,通過組合的方式嵌入抽象基類
2杏死、變化的行為抽象基類為章姓,所有可變變化的父類
3、用戶類的最終實例识埋,通過注入行為實例的方式凡伊,設(shè)定易變行為
防止了繼承行為方式,導(dǎo)致無關(guān)行為污染子類窒舟。完成了策略封裝和可替換性系忙。
六、簡單工廠模式
簡單工廠模式中定義一個抽象類惠豺,抽象類中聲明公共的特征及屬性银还,抽象子類繼承自抽象類风宁,去實現(xiàn)具體的操作。工廠類根據(jù)外界需求蛹疯,在工廠類中創(chuàng)建對應(yīng)的抽象子類實例并傳給外界冒掌,而對象的創(chuàng)建是由外界決定的考抄。外界只需要知道抽象子類對應(yīng)的參數(shù)即可呼胚,而不需要知道抽象子類的創(chuàng)建過程谋作,在外界使用時甚至不用引入抽象子類。
6.1應(yīng)用場景
工廠方式創(chuàng)建類的實例列吼,多與proxy模式配合幽崩,創(chuàng)建可替換代理類。
6.2優(yōu)勢
易于替換寞钥,面向抽象編程慌申,application只與抽象工廠和易變類的共性抽象類發(fā)生調(diào)用關(guān)系。
6.3敏捷原則
DIP依賴倒置原則
6.4實例
項目部署環(huán)境中依賴多個不同類型的數(shù)據(jù)庫時理郑,需要使用工廠配合proxy完成易用性替換
6.5注意事項
項目初期蹄溉,軟件結(jié)構(gòu)和需求都沒有穩(wěn)定下來時,不建議使用此模式您炉,因為其劣勢也很明顯类缤,增加了代碼的復(fù)雜度,增加了調(diào)用層次邻吭,增加了內(nèi)存負擔。