寫在前面
設計模式是一套被反覆使用、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是爲了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。當然設計模式和語言沒有關係,它是一種編程思想。本篇將介紹觀察者計模式(又稱發佈-訂閱模式)的實現,以OC語言爲例
詳細內容
- 對觀察者模式的理解
上面已經提到觀察者模式又叫發佈-訂閱模式,就像雜誌的訂閱一樣,當你訂閱一本雜誌時,雜誌社 會記錄你–訂閱者的信息,當有新的被雜誌更新時,你就會收到訂閱的雜誌。這就是觀察者模式的工作原理。 - 和代理模式的區別
對於單一代理(就是代理類只有一個指向實體類對象的指針)來說,它反映了對象之間一對一的關聯關係,和觀察者有很大不同;觀察者模式允許主題對象有多個觀察者,這就反映出對象之間一對多的關係。 - UML類圖
- 具體實現步驟
這裏按照上圖的步驟大體實現一下:
- 項目結構
紅色部分:抽象通知者和抽象觀察者
藍色部分:抽象觀察者類和具體觀察者類
抽象的一方都是協議,具體的一方遵守了對應的協議。 - 主要代碼分析
- 抽象通知者(協議)
// 抽象通知者,主要定義了,通知者的具體行爲,包含了添加、移除通知者和發送通知 (尖括號用了中括號代替)
@protocol GYAbstractSubjectProtocol [NSObject]
-(void)attach:(id[GYAbstractObserverProtocol]) observer;
-(void)detach:(id[GYAbstractObserverProtocol]) observer;
-(void)notify;
- 具體通知者(類)
/* 存放觀察者對象的數組/
@property (nonatomic, strong) NSMutableArray *observers;
// 協議中的方法實現
-(void)attach:(id) observer
{
[self.observers addObject:observer];
}
-(void)detach:(id) observer
{
[self.observers removeObject:observer];
}
-(void)notify
{
// 遍歷觀察者數組,通知每一個觀察者
[self.observers enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if ([obj respondsToSelector:@selector(update:)])
{
[obj update:@{@"OK":@"成功了!"}];
}
}];
}
- 抽象觀察者(協議)
// 抽象觀察者
@protocol GYAbstractObserverProtocol
-(void)update:(NSDictionary *)dict;
@end
- 具體觀察者(類)
-(void)update:(NSDictionary *)dict
{
NSLog(@"%s -- %@", func, dict);
}
- 抽象通知者(協議)
- 全部的代碼
- 參照這裏
- 項目結構
總結
這裏主要簡單介紹了觀察者設計模式的實現,通過觀察者模式,可以降低對象之間的耦合度。希望對大家有所幫助。
若大家發現錯誤,歡迎指正。共同交流,共同進步!謝謝閱讀!