IOS常用設計模式——觀察者模式(IOS開發)
觀察者模式(Observer)也叫發布/訂閱模式(Publish/Subscribe)
- 問題:
在軟體設計中,經常需要對一個對象的狀態改變,從而引起很多個物件的狀態發生改變。這個特點很明顯,複用性強,而且對象之間匿名通訊。觀察者模式最為適合。
- 原理:
舉個例子:
包括四個角色:
1、抽象主題(subject)。是個協議,是一個觀察者集合容器,定義了添加,移除和對所有觀察者發送通知(分別對應attach/detach/notifyObserver三個方法)。
2、抽象觀察者(Observer)。也是個協議,有一個更新方法(update)但是只是對自身進行Tlog。
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機制:再對象屬性變化時通知給觀察者,而不是對所有觀察者都發送通知
我還沒有遇到過!所以無法理解!下次再做修改!