觀察者模式(Observer)也叫發布/訂閱模式(Publish/Subscribe)
- 問題:
在軟件設計中,經常需要對一個對象的狀態改變,從而引起很多對象的狀態發生改變。這個特點很明顯,復用性強,而且對象之間匿名通信。觀察者模式最為適合。
- 原理:
舉個例子:
包括四個角色:
1、抽象主題(subject)。是個協議,是一個觀察者集合容器,定義了添加,移除和對所有觀察者發送通知(分別對應attach/detach/notifyObserver三個方法)。
2、抽象觀察者(Observer)。也是個協議,有一個更新方法(update)但是只是對自身進行日志處理。
3、具體觀察者(ConcreteObserver)。Observer協議的具體實現。
4、具體主題(ConcreteSubject)。Subject協議的具體實現。
兩個協議不僅提高了系統的可復用性,還降低了藕合度。
// Observer.h @protocol Observer @required -(void)update; @end // Subject.h @class Observer @protocol Subject @required -(void)attach:(Observer *) observer; -(void)detach:(Observer *) observer; -(void)notifyObservers; @end // ConcreteObserver.h #import "Observer.h" @interface ConcreteObserver : NSObject@end // ConcreteObserver.m #import "ConcreteObserver.h" @implementation ConcreteObserver -(void)update { NSLog("%@", self); } @end // ConcreteSubject.h #import "Subject.h" @class Observer; @interface ConcreteSubject : NSObject { NSMutableArray* observers; } @property (nonatomic, strong) NSMutableArray* observers; +(ConcreteSubject*)sharedConcreteSubject; @end // ConcreteSubject.m #import "ConcreteSubject.h" @implementation ConcreteSubject @synthesize observers; static ConcreteSubject *sharedConcreteSubject = nil; +(ConcreteSubject)sharedConcreteSubject { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ sharedConcreteSubject = [[self alloc] init]; sharedConcreteSubject.observers = [[NSMutableArray alloc] init]; }); return sharedConcreteSubject; } - (void) attach:(Observer*) observer { [self.observers addObject:observer]; } - (void) detach:(Observer*) observer { [self.observers removeObject:observer]; } - (void)notifyObservers { for (id obs in self.observers) { [obs update]; } } @end
一、通知機制
整個流程可以這麼說:抽象主題(協議)負責聲明一些方法,然後交給具體主題去實現方法,然後對每一個觀察者進行操作。
-應用:
通知機制(notification):
這個應該通過實例來講,但是這樣真的復雜的一比。所以我盡量講明白這個過程。
通知時典型的一對多對象的通信。
這裡面有三個角色:
1、投送對象(協議):抽象主題
2、通知中心(NSNotificationCenter):具體主題
3、接收者:觀察者
流程:
1、首先接受者們去注冊通知。(addObserver:selector:name:object:)
2、投送對象向消息中心投送通知。(applicationWillTerminate:)
3、廣播中心對所有的接受者進行廣播。然後接受者通過(handleTerminate:)方法去接受notification
4、接受者可以解除消息通知(removeObserver:)
二、KVO機制:再對象屬性變化時通知給觀察者,而不是對所有觀察者都發送通知
我還沒有遇到過!所以無法理解!下次再做修改!