設計模式-觀察者模式

觀察模式定義了一種一對多的依賴關係,讓多個觀察者對象同時監聽摸一個主題對象。這個主題對象在狀態發生變化時,會通知全部觀察者對象,使它們可以更新本身。異步

代碼:atom

#import <Foundation/Foundation.h>

@protocol Observer <NSObject>
@optional
- (void)update;
@end

@interface MDbeObserverd : NSObject
- (void)attech:(id<Observer>)obj;
- (void)detech:(id<Observer>)obj;
- (NSArray *)getObserverList;
- (void)notify;
@property (nonatomic, strong)NSMutableArray *list;
@end

@implementation MDbeObserverd

- (NSMutableArray *)list
{
    if (!_list) {
        _list = [NSMutableArray array];
    }
    return _list;
}

- (void)attech:(id <Observer> )obj
{
    if (!obj) {
        return;
    }
    [self.list addObject:obj];
}

- (void)detech:(id <Observer> )obj
{
    if (!obj) {
        return;
    }
    for (id observered in self.list) {
        if (observered == obj) {
            [self.list removeObject:obj];
        }
    }
}

- (NSArray *)getObserverList
{
    return [NSArray arrayWithArray:self.list];
}

- (void)notify
{
    // 狀態發生改變時
    NSLog(@"門開了");
    // 對綁定的觀察者對象發送通知。
    for (id<Observer> obj in self.list) {
        [obj update];
    }
}
@end


@interface MDObserver1 : NSObject<Observer>
@end
@implementation MDObserver1

- (void)update
{
    NSLog(@"擦,老闆回來了,趕忙關了nba的網頁");
}
@end


@interface MDObserver2 : NSObject<Observer>
@end
@implementation MDObserver2

- (void)update
{
    NSLog(@"擦,老媽回來了,關了電腦,寫做業去");
}
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        MDbeObserverd *beObervered = [[MDbeObserverd alloc]init];
        MDObserver1 *obj1 = [MDObserver1 new];
        MDObserver2 *obj2 = [MDObserver2 new];
        MDObserver2 *obj22 = [MDObserver2 new];
        // 如果不綁定就不會發送通知了。
        [beObervered attech:obj1];
        [beObervered attech:obj2];
        [beObervered attech:obj22];
        [beObervered detech:obj22];
        [beObervered notify];
    }
    return 0;
}

觀察者模式的效果有如下的優勢:線程

 第1、觀察者模式在被觀察者和觀察者之間創建一個抽象的耦合。被觀察者角色所知道的只是一個具體觀察者列表,每個具體觀察者都符合一個抽象觀察者的接口。被觀察者並不認識任何一個具體觀察者,它只知道它們都有一個共同的接口。code

 因爲被觀察者和觀察者沒有緊密地耦合在一塊兒,所以它們能夠屬於不一樣的抽象化層次。若是被觀察者和觀察者都被扔到一塊兒,那麼這個對象必然跨越抽象化和具體化層次。server

 第2、觀察者模式支持廣播通信。被觀察者會向全部的登記過的觀察者發出通知,對象

 觀察者模式有下面的缺點:接口

 第1、若是一個被觀察者對象有不少的直接和間接的觀察者的話,將全部的觀察者都通知到會花費不少時間。rem

 第2、若是在被觀察者之間有循環依賴的話,被觀察者會觸發它們之間進行循環調用,致使系統崩潰。在使用觀察者模式是要特別注意這一點。get

 第3、若是對觀察者的通知是經過另外的線程進行異步投遞的話,系統必須保證投遞是以自恰的方式進行的。it

 第4、雖然觀察者模式能夠隨時使觀察者知道所觀察的對象發生了變化,可是觀察者模式沒有相應的機制使觀察者知道所觀察的對象是怎麼發生變化的。

相關文章
相關標籤/搜索