觀察者模式

觀察者模式屬於行爲型模式,其意圖是定義對象間的一種一對多的依賴關係,當一個對象的狀態發生改變時,全部依賴於它的對象都獲得通知並被自動更新。在製做系統的過程當中,將一個系統分割成一系列相互協做的類有一個常見的反作用:須要維護相關對象間的一致性。咱們不但願爲了維持一致性而使各種緊密耦合,由於這樣下降了他們的可充用性。這一個模式的關鍵對象是目標(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
相關文章
相關標籤/搜索