MST
星途 面试题库

面试题:Objective-C中观察者模式的基本实现

请用Objective-C代码实现一个简单的观察者模式示例,包含至少一个观察者和一个被观察对象,描述清楚如何注册观察者、通知观察者以及解除注册的过程。
23.5万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试
  1. 定义被观察对象(Subject)
    • 首先创建一个被观察对象类,它需要维护一个观察者数组,并提供注册、通知和解除注册的方法。
    #import <Foundation/Foundation.h>
    
    @class Observer;
    
    @interface Subject : NSObject
    
    - (void)registerObserver:(Observer *)observer;
    - (void)unregisterObserver:(Observer *)observer;
    - (void)notifyObservers;
    
    @end
    
    @implementation Subject {
        NSMutableArray<Observer *> *_observers;
    }
    
    - (instancetype)init {
        self = [super init];
        if (self) {
            _observers = [NSMutableArray array];
        }
        return self;
    }
    
    - (void)registerObserver:(Observer *)observer {
        [_observers addObject:observer];
    }
    
    - (void)unregisterObserver:(Observer *)observer {
        [_observers removeObject:observer];
    }
    
    - (void)notifyObservers {
        for (Observer *observer in _observers) {
            [observer update];
        }
    }
    
    @end
    
  2. 定义观察者(Observer)
    • 观察者类需要有一个接收通知的方法。
    #import <Foundation/Foundation.h>
    
    @class Subject;
    
    @protocol ObserverProtocol <NSObject>
    
    - (void)update;
    
    @end
    
    @interface Observer : NSObject <ObserverProtocol>
    
    - (instancetype)initWithSubject:(Subject *)subject;
    
    @end
    
    @implementation Observer {
        Subject *_subject;
    }
    
    - (instancetype)initWithSubject:(Subject *)subject {
        self = [super init];
        if (self) {
            _subject = subject;
            [_subject registerObserver:self];
        }
        return self;
    }
    
    - (void)update {
        NSLog(@"Observer received notification.");
    }
    
    - (void)dealloc {
        [_subject unregisterObserver:self];
    }
    
    @end
    
  3. 使用示例
    • main 函数中展示如何使用观察者模式。
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            Subject *subject = [[Subject alloc] init];
            Observer *observer = [[Observer alloc] initWithSubject:subject];
    
            [subject notifyObservers];
    
            // 如果想手动解除注册
            [subject unregisterObserver:observer];
            [subject notifyObservers];
        }
        return 0;
    }
    

在上述代码中:

  • 注册观察者:在 ObserverinitWithSubject: 方法中,调用 [subject registerObserver:self] 将自身添加到 Subject 的观察者数组中。
  • 通知观察者SubjectnotifyObservers 方法遍历观察者数组,对每个观察者调用 update 方法。
  • 解除注册SubjectunregisterObserver: 方法从观察者数组中移除指定的观察者。在 Observerdealloc 方法中,也会自动解除注册,以防止内存泄漏。