觀察者模式是設計模式的一種,又稱爲發佈者/訂閱者模式,其定義了一種一對多的關係,多個觀察者能夠監聽一個對象。當該對象的狀態發生改變時,會通知全部的觀察者,觀察者會本身進行更新。設計模式
觀察者模式可以將觀察者和被觀察者解耦,被觀察者不須要知道觀察者是如何更新的,只須要在本身的狀態發生改變時,通知觀察者便可。函數
在實際工做中,當一個對象的改變,同時須要改變其餘對象,且不肯定有多少對象須要改變的時候,能夠使用觀察者模式。spa
在實現觀察者模式時,觀察者須要實現相應的更新方法;被觀察者須要實現增長觀察者、移除觀察者、向觀察者發送通知的方法。設計
舉個例子,有兩個模型對象,分別是老師和學生,其中學生是觀察者,老師是被觀察者。當老師的手機號發生改變時,會向學生髮出通知,這樣全部學生的「老師的電話號」這個屬性就會更新。server
實現代碼:對象
觀察者對象:blog
- (instancetype)initWithName:(NSString *)name { if(self = [super init]){ self.name = name; self.teacherNum = @""; } return self; } // 觀察者實現更新方法 - (void)updateTeacherPhone:(NSString *)phone { self.teacherNum = phone; }
被觀察者對象:開發
- (instancetype)initWithName:(NSString *)name { if(self = [super init]){ self.name = name; self.phoneNum = @""; self.observersArray = [NSMutableArray array]; } return self; } // 增長觀察者對象 - (void)addObserver:(Student *)stu { if(![self.observersArray containsObject:stu]){ [self.observersArray addObject:stu]; } } // 移除某個觀察者對象 - (void)removeObserver:(Student *)stu { if([self.observersArray containsObject:stu]){ [self.observersArray removeObject:stu]; } } // 向全部的觀察者對象發出通知 - (void)notificationObserver { for(int i = 0; i < self.observersArray.count ; ++i){ Student *stu = [self.observersArray objectAtIndex:i]; if([stu respondsToSelector:@selector(updateTeacherPhone:)]){ [stu updateTeacherPhone:self.phoneNum]; } } }
在main函數中調用:rem
Student *jhon = [[Student alloc] initWithName:@"jhon"]; Student *tom = [[Student alloc] initWithName:@"tom"]; Teacher *teacher = [[Teacher alloc] initWithName:@"Green"]; // 增長觀察者 [teacher addObserver:jhon]; [teacher addObserver:tom]; teacher.phoneNum = @"123456"; // 通知全部的觀察者進行更新 [teacher notificationObserver]; NSLog(@"jhon teacherPhone = %@",jhon.teacherNum); NSLog(@"tom teacherPhone = %@",tom.teacherNum); // 移除一個觀察者 [teacher removeObserver:jhon]; teacher.phoneNum = @"654321"; // 通知全部的觀察者進行更新 [teacher notificationObserver]; NSLog(@"jhon teacherPhone = %@",jhon.teacherNum); NSLog(@"tom teacherPhone = %@",tom.teacherNum);
輸出結果: it
jhon teacherPhone = 123456 tom teacherPhone = 123456 jhon teacherPhone = 123456 tom teacherPhone = 654321
能夠看到,被觀察者將某個觀察者移除後,被觀察者狀態發生改變並通知觀察者,被移除的觀察者狀態不變。
實際上,在iOS開發中,KVO以及消息中心都是使用觀察者模式實現的。