iOS常用設計模式總結

很多剛入門的iOS開發(fā)者經(jīng)過短期訓練,都可以熟練的調(diào)用API,這時候,寫一個tableView,實現(xiàn)一個小動畫,獨立完成一個交互的功能,已經(jīng)不在話下。但同時,iOS開發(fā)者也會遇到技術上的第一個瓶頸——即擁有獨立開發(fā)一個功能的水平,卻似乎并未達到獨立開發(fā)一個App的水平;看似什么都會做,什么都能做,卻總是不能在第一時間想到最佳方案;功能是完成了,然而效率并不高,代碼邏輯在日后也可能需要返工重構。
我認為,突破這個瓶頸的捷徑就是掌握設計模式。設計模式是前人總結的。面對開發(fā)中常見問題的解決方案——它們行之有效,便于理解,適合舉一反三。簡單點兒說,設計模式就是程序開發(fā)的套路和模板。熟練掌握設計模式,可以提高開發(fā)效率,節(jié)省開發(fā)時間。這樣,我們就可以站在前人的肩膀上,去研究、解決那些具有挑戰(zhàn)性和未曾解決過的問題。

一、平常開發(fā)中用到的設計模式

iOS開發(fā)中的設計模式有很多,一般常見的有以下7種。

  • MVC:它是應用的一種基本架構,主要目的是將不同的代碼歸并為不同的模塊,做到低耦合、代碼分配合理、易于擴展維護。
  • 裝飾模式(Decorator):它可以在不修改原代碼的基礎上進行擴展。注意它與繼承最大的區(qū)別是:繼承時,子類可以修改父類的行為,而裝飾模式不希望如此。
  • 適配器模式(Adapter):它將一個類的接口轉換為另一個類的接口,使得原本互不兼容的類可以通過接口一起工作。
  • 外觀模式(Facade):它用一個公共接口來連接多個類或其他數(shù)據(jù)類型。公共接口讓多個互相之間保持獨立,解耦性能良好。同時,使用接口時,外部無須理解其背后復雜的邏輯。另外,就算接口背后的邏輯改變也不影響接口的使用。
  • 單例模式(Singleton):此模式保證對于一個特有的類,只有一個公共的實例存在。它一般與懶加載一起出現(xiàn),只有被需要時才會創(chuàng)建。單例模式的例子有UserDefaults.standard,UIApplication.shared和UIScreen.main。
  • 觀察者模式(Observer):它定義對象之間的一種一對多的依賴關系,每當一個對象狀態(tài)發(fā)生改變時,其相關依賴對象皆得到通知并被自動更新。在iOS中的典型實現(xiàn)是NotificationCenter和KVO.
  • 備忘錄模式(Memento):它在不破壞封裝性的前提下,捕獲一個對象的內(nèi)部狀態(tài),并在該對象之外保存這個狀態(tài)。這樣就可以將改對象恢復到保存之前的狀態(tài)。
    可以把上面7種模式歸為一下3類。
  • 創(chuàng)建型(Creational):單例模式(Singleton).
  • 結構型(Structural):MVC、裝飾模式(Decorator)、適配器模式(Adapter)和外觀模式(Facade)。
  • 行為型(Bahavioral):觀察者模式(Observer)、備忘錄模式(Memento)

二、什么是MVC?

MVC,即Model-View-Controller。它是蘋果公司官方推薦的App開發(fā)架構,也是一般開發(fā)者最先遇到,最經(jīng)典的架構。它把整個App分為三個部分:Model負責處理數(shù)據(jù);View負責處理UI;Controller是View和Model的橋梁,它將數(shù)據(jù)從Model層傳送到View層并展示出來,同時將View層的交互傳到Model層以改變數(shù)據(jù)。相比傳統(tǒng)的MVC,蘋果的MVC的特點是,Model層和View層是相互獨立的。
由于Controller承擔的任務相對較重,在實際開發(fā)中,很多初級開發(fā)者直接將View和Controller部分的代碼全部塞到了ViewController類中,造成了它們的高度耦合。如何解耦View和Controller,在iOS開發(fā)中使一個熱門的話題。

三、OC和Swift在單例模式的創(chuàng)建上有什么區(qū)別?

單例模式在創(chuàng)建過程中,要保證實例變量只被創(chuàng)建一次。在整個開發(fā)中需要特別注意線程安全,即使在多線程情況下,依然只初始化一次變量。
在OC中使用GCD來保證這一點的。示例代碼如下:

+ (instanceType)sharedManager {
   static Manager *sharedManager = nil;
   static dispatch_once_t onceToken;
   dispatch_once(&onceToken,  ^{
        shareManager = [[Manager alloc] init];
    });
    return sharedManager;
}

在Swift中,let關鍵詞已經(jīng)保證了實例變量不會被修改,所以單例的創(chuàng)建就簡單很多:

class Manager {
  static let shared = Manager()
  private init() {}
}

四、什么是裝飾模式

裝飾模式是在不改變原封裝的前提下,為對象動態(tài)添加新功能的模式。在OC中,它的實現(xiàn)模式為Category和Delegation;在Swift中,它的實現(xiàn)形式為Extension和Delegation。

  • Category的好處之一是可以給類增加新的方法,它也可以利用動態(tài)特性增加新的變量。同時,Category的出現(xiàn)也減輕了類的負擔,可以利用它將代碼分散開。它的文件名形式一般為“類名+擴展名”。
  • Extension在Swift中的地位等同于Category在OC中的地位。它更強大的地方在于可以為Protocol擴展完成默認實現(xiàn)。
  • Delegation是程序中一個對象代表另一個對象,或者一個對象與另一個對象協(xié)同工作的模式,其一般配合protocol使用。例如tableView的UITableViewDataSource和UITableViewDelegate就是典型的Delegation模式。

注意,delegate一般被聲明為weak,以防止循環(huán)引用。

五、什么是觀察者模式(Observer)

觀察者模式定義對象之間的一種一對多依賴關系,每當一個對象狀態(tài)發(fā)生改變時,其相關依賴對象皆得到通知并被自動更新。在iOS開發(fā)中,典型的推模型實現(xiàn)方式為通知和KVO.
1.通知(Notifications)

  • 注冊觀察者Observer:通過NotificationCenter的addObserver:selector:name:object接口來注冊對某一類型通知感興趣。在注冊時一定要注意,NotificationCenter不會對觀察者進行引用計數(shù)+1的操作。
  • 通知中心NSNotificationCenter:通知的樞紐。
  • 被觀察的對象:通過postNotificationName:object:userInfo:發(fā)送某一類型通知,廣播改變。
  • 通知對象Notification:當有通知來的時候,通知中心會調(diào)用觀察者注冊的接口來廣播通知,同時傳遞存儲著要更改內(nèi)容的Notification對象。

2.KVO
KVO,Key-Value Observer,即鍵值觀察。它是一種沒有通知中心的觀察者模式的實現(xiàn)方式。一個主體對象管理所有依賴于它的觀察者對象,并且在自身狀態(tài)發(fā)生改變時主動通知觀察者對象。KVO是一個純OC的概念,Swift當前沒有很好的動態(tài)機制,而且目前只有NSObject才支持KVO.它的具體實現(xiàn)步驟如下。
(1)注冊觀察者
(2)更改主題對象屬性的值,即觸發(fā)發(fā)送更改的通知。
(3)在制定的回調(diào)函數(shù)中,處理收到的更改通知。
在Swift 4中,我們不需要再手動的回收observer了。同時配合NSKeyValueObservation,我們可以更簡單地使用KVO了,下面是示例代碼:

// 在Swift4中,NSObject的類不再自動推斷為@objc,需要用@objcMembers來聲明其Objective-C特性
@objcMembers class User : NSObject {
    // dynamic關鍵詞對observe的閉包來說是必需的
    dynamic var email : String
    
    init(email: String) {
        self.email = email
    }
    
    
}
let user = User(email:"user@hotmail.com")

// 注冊觀察email屬性值,閉包中為若發(fā)生變化做出的相應處理
let observation = user.observe(\.email) {(user,change) in
    print("User's new email:\(user.email)")
}

user.email = "user@outlook.com"

六、什么是備忘錄模式(Memento)

備忘錄模式是一種保存對象當前的狀態(tài),并在日后可以恢復的模式。注意它不會破壞對象的封裝,也就是說,私有對象也能保存下來。
備忘錄模式最經(jīng)典的使用方法就是用UserDefaults來讀寫,同時配合??梢源鎯σ幌盗袪顟B(tài)。它經(jīng)常用于初始化、重啟、App前后臺狀態(tài)改變等場景。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容