ObjC-觀察者模式

觀察者模式是設計模式的一種,又稱爲發佈者/訂閱者模式,其定義了一種一對多的關係,多個觀察者能夠監聽一個對象。當該對象的狀態發生改變時,會通知全部的觀察者,觀察者會本身進行更新。設計模式

觀察者模式可以將觀察者和被觀察者解耦,被觀察者不須要知道觀察者是如何更新的,只須要在本身的狀態發生改變時,通知觀察者便可。函數

在實際工做中,當一個對象的改變,同時須要改變其餘對象,且不肯定有多少對象須要改變的時候,能夠使用觀察者模式。spa

在實現觀察者模式時,觀察者須要實現相應的更新方法;被觀察者須要實現增長觀察者、移除觀察者、向觀察者發送通知的方法。設計

舉個例子,有兩個模型對象,分別是老師和學生,其中學生是觀察者,老師是被觀察者。當老師的手機號發生改變時,會向學生髮出通知,這樣全部學生的「老師的電話號」這個屬性就會更新。server

實現代碼:對象

觀察者對象:blog

 

- (instancetype)initWithName:(NSString *)name
{
    if(self = [super init]){
        self.name = name;
        self.teacherNum = @"";
    }
    return self;
}
// 觀察者實現更新方法
- (void)updateTeacherPhone:(NSString *)phone
{
    self.teacherNum = phone;
}

 

被觀察者對象:開發

- (instancetype)initWithName:(NSString *)name
{
    if(self = [super init]){
        self.name = name;
        self.phoneNum = @"";
        self.observersArray = [NSMutableArray array];
    }
    return self;
}

// 增長觀察者對象
- (void)addObserver:(Student *)stu
{
    if(![self.observersArray containsObject:stu]){
        [self.observersArray addObject:stu];
    }
}

// 移除某個觀察者對象
- (void)removeObserver:(Student *)stu
{
    if([self.observersArray containsObject:stu]){
        [self.observersArray removeObject:stu];
    }
}

// 向全部的觀察者對象發出通知
- (void)notificationObserver
{
    for(int i = 0; i < self.observersArray.count ; ++i){
        Student *stu = [self.observersArray objectAtIndex:i];
        if([stu respondsToSelector:@selector(updateTeacherPhone:)]){
            [stu updateTeacherPhone:self.phoneNum];
        }
    }
}

在main函數中調用:rem

    Student *jhon = [[Student alloc] initWithName:@"jhon"];
    Student *tom = [[Student alloc] initWithName:@"tom"];
    Teacher *teacher = [[Teacher alloc] initWithName:@"Green"];
    // 增長觀察者
    [teacher addObserver:jhon];
    [teacher addObserver:tom];
    teacher.phoneNum = @"123456";
    // 通知全部的觀察者進行更新
    [teacher notificationObserver];
    NSLog(@"jhon teacherPhone = %@",jhon.teacherNum);
    NSLog(@"tom teacherPhone = %@",tom.teacherNum);
    // 移除一個觀察者
    [teacher removeObserver:jhon];
    teacher.phoneNum = @"654321";
    // 通知全部的觀察者進行更新
    [teacher notificationObserver];
    NSLog(@"jhon teacherPhone = %@",jhon.teacherNum);
    NSLog(@"tom teacherPhone = %@",tom.teacherNum);

輸出結果:  it

jhon teacherPhone = 123456
tom teacherPhone = 123456
jhon teacherPhone = 123456
tom teacherPhone = 654321

能夠看到,被觀察者將某個觀察者移除後,被觀察者狀態發生改變並通知觀察者,被移除的觀察者狀態不變。

實際上,在iOS開發中,KVO以及消息中心都是使用觀察者模式實現的。

相關文章
相關標籤/搜索