iOS 常用設(shè)計模式匯總

在軟件開發(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ù),并管理其他對象的生命周期苛白。

66.jpg

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)存負擔。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末宴霸,一起剝皮案震驚了整個濱河市囱晴,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瓢谢,老刑警劉巖畸写,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異氓扛,居然都是意外死亡枯芬,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門采郎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來千所,“玉大人,你說我怎么就攤上這事蒜埋∫担” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵整份,是天一觀的道長待错。 經(jīng)常有香客問我籽孙,道長,這世上最難降的妖魔是什么火俄? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任犯建,我火速辦了婚禮,結(jié)果婚禮上瓜客,老公的妹妹穿的比我還像新娘适瓦。我一直安慰自己,他們只是感情好忆家,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布犹菇。 她就那樣靜靜地躺著,像睡著了一般芽卿。 火紅的嫁衣襯著肌膚如雪揭芍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天卸例,我揣著相機與錄音称杨,去河邊找鬼。 笑死筷转,一個胖子當著我的面吹牛姑原,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播呜舒,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼锭汛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了袭蝗?” 一聲冷哼從身側(cè)響起唤殴,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎到腥,沒想到半個月后朵逝,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡乡范,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年配名,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片晋辆。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡渠脉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瓶佳,到底是詐尸還是另有隱情连舍,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站索赏,受9級特大地震影響盼玄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜潜腻,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一埃儿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧融涣,春花似錦童番、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至忽你,卻和暖如春幼东,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背科雳。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工根蟹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人糟秘。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓简逮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親尿赚。 傳聞我的和親對象是個殘疾皇子散庶,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)凌净,斷路器悲龟,智...
    卡卡羅2017閱讀 134,672評論 18 139
  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,152評論 30 470
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法泻蚊,內(nèi)部類的語法,繼承相關(guān)的語法丑婿,異常的語法性雄,線程的語...
    子非魚_t_閱讀 31,644評論 18 399
  • 設(shè)計模式匯總 一、基礎(chǔ)知識 1. 設(shè)計模式概述 定義:設(shè)計模式(Design Pattern)是一套被反復(fù)使用羹奉、多...
    MinoyJet閱讀 3,948評論 1 15
  • 總是向往閑暇的時光诀拭,當真正很近的觸碰它時迁筛,便開始懷念活力的校園時光,其實校園時光并不是拘束耕挨,而是身處其中卻難以發(fā)現(xiàn)...
    X子衿閱讀 521評論 0 3