觀察者模式屬於行爲型模式,其意圖是定義對象間的一種一對多的依賴關係,當一個對象的狀態發生改變時,全部依賴於它的對象都獲得通知並被自動更新。在製做系統的過程當中,將一個系統分割成一系列相互協做的類有一個常見的反作用:須要維護相關對象間的一致性。咱們不但願爲了維持一致性而使各種緊密耦合,由於這樣下降了他們的可充用性。這一個模式的關鍵對象是目標(Subject)和觀察者(Observer)。一個目標能夠有任意數目的依賴它的觀察者,一旦目標的狀態發生改變,全部的觀察者都獲得通知,做爲對這個通知的響應,每一個觀察者都將查詢目標以使其狀態與目標的狀態同步。這種交互也稱爲發佈-訂閱模式,目標是通知的發佈者。他發出通知時並不須要知道誰是他的觀察者,能夠有任意數據的觀察者訂閱並接收通知。
參與者:
BeObserver(目標,BeObserver):
目標知道它的觀察者。能夠有任意多個觀察者觀察同一個目標。
提供註冊和刪除觀察者對象的接口。
Observer(觀察者,Observer):爲那些在目標發生改變時須要得到通知的對象定義一個更新接口。
相關代碼:atom
///觀察者代理方法 @protocol ObserverDelegate <NSObject> - (void) update:(NSString *)name; //被觀察對象發生變化,調用觀察者的update方法 @end /** * 觀察者,須要實現ObserverDelegate協議 */ @interface Observer : NSObject<ObserverDelegate> @property(nonatomic, copy)NSString *name; @end /** * 被觀察者 */ @interface BeObserver : NSObject @property(nonatomic, copy) NSString *name; @property(nonatomic, strong) NSMutableArray *observerLists; - (void)addObserver:(id<ObserverDelegate>)observer; - (void)removeObserver:(id<ObserverDelegate>)observer; - (void)notify; @end @implementation Observer - (id)init { if (self = [super init]) { self.name = @"before update"; } return self; } - (void) update:(NSString *)name { self.name = name; } @end @implementation BeObserver - (id)init { if (self = [super init]) { self.name = @"before update"; self.observerLists = [[NSMutableArray alloc] init]; } return self; } - (void)addObserver:(id<ObserverDelegate>)observer { [self.observerLists addObject:observer]; } - (void)removeObserver:(id<ObserverDelegate>)observer { [self.observerLists removeObject:observer]; } - (void)notify { for(id<ObserverDelegate> observer in self.observerLists) { if ([observer respondsToSelector:@selector(update:)]) { [observer update:self.name]; } } } @end