Objective C 语言 如何实现观察者模式

Objective-C阿木 发布于 21 天前 5 次阅读


摘要:

观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。在Objective-C中,我们可以通过使用通知(Notification)机制或者KVO(Key-Value Observing)机制来实现观察者模式。本文将详细介绍这两种方法,并提供相应的代码示例。

一、

观察者模式在软件开发中非常常见,它能够提高代码的可维护性和可扩展性。在Objective-C中,我们可以通过以下两种方式实现观察者模式:

1. 使用通知(Notification)机制

2. 使用KVO(Key-Value Observing)机制

二、使用通知(Notification)机制实现观察者模式

1. 通知中心(NSNotificationCenter)

在Objective-C中,通知中心(NSNotificationCenter)是管理通知发送和接收的核心类。它允许对象订阅和发布通知。

2. 发布通知

要发布一个通知,可以使用NSNotificationCenter的+notifyObserver方法。

3. 订阅通知

要订阅一个通知,可以使用NSNotificationCenter的+addObserver方法。

以下是一个使用通知实现观察者模式的简单示例:

objective-c

// 观察者模式示例

// 定义一个通知名称


NSString const MyNotification;

// 观察者类


@interface Observer : NSObject


@property (nonatomic, strong) NSString name;


@end

@implementation Observer


- (void)observeNotification:(NSNotification )notification {


NSLog(@"Observer received notification: %@", notification.name);


NSLog(@"Observer's name: %@", self.name);


}


@end

// 被观察者类


@interface Observable : NSObject


@property (nonatomic, strong) NSString name;


@property (nonatomic, strong) NSNotificationCenter notificationCenter;


@end

@implementation Observable


- (instancetype)initWithName:(NSString )name {


self = [super init];


if (self) {


_name = name;


_notificationCenter = [NSNotificationCenter defaultCenter];


// 注册通知


[_notificationCenter addObserver:self selector:@selector(observeNotification:) name:MyNotification object:nil];


}


return self;


}

- (void)notifyObservers {


// 发布通知


[self.notificationCenter postNotificationName:MyNotification object:nil];


}

- (void)dealloc {


// 取消订阅通知


[self.notificationCenter removeObserver:self];


}


@end

int main(int argc, const char argv[]) {


@autoreleasepool {


// 创建被观察者对象


Observable observable = [[Observable alloc] initWithName:@"Observable"];



// 创建观察者对象


Observer observer1 = [[Observer alloc] init];


observer1.name = @"Observer1";



Observer observer2 = [[Observer alloc] init];


observer2.name = @"Observer2";



// 订阅通知


[[NSNotificationCenter defaultCenter] addObserver:observer1 selector:@selector(observeNotification:) name:MyNotification object:nil];


[[NSNotificationCenter defaultCenter] addObserver:observer2 selector:@selector(observeNotification:) name:MyNotification object:nil];



// 触发通知


[observable notifyObservers];



// 取消订阅通知


[[NSNotificationCenter defaultCenter] removeObserver:observer1];


[[NSNotificationCenter defaultCenter] removeObserver:observer2];


}


return 0;


}


三、使用KVO(Key-Value Observing)机制实现观察者模式

1. KVO简介

KVO是Objective-C中的一种机制,允许对象在特定属性值发生变化时通知观察者。

2. 实现KVO

要实现KVO,需要满足以下条件:

- 被观察对象必须实现`NSKeyValueObserving`协议。

- 被观察对象的属性必须使用`@dynamic`关键字声明。

- 观察者需要实现`observeValueForKeyPath:ofObject:change:context:`方法。

以下是一个使用KVO实现观察者模式的示例:

objective-c

// KVO观察者模式示例

// 被观察者类


@interface Observable : NSObject


@property (nonatomic, strong) NSString name;


@end

@implementation Observable


@dynamic name;

- (void)observeValueForKeyPath:(NSString )keyPath ofObject:(id)object change:(NSDictionary )change context:(void )context {


if (context == (void )self) {


NSLog(@"Observable's name changed from %@ to %@", change[NSOldKey], change[NSNewKey]);


}


}

- (void)dealloc {


[self removeObserver:self forKeyPath:@"name"];


}


@end

// 观察者类


@interface Observer : NSObject


@end

@implementation Observer


- (void)observeValueForKeyPath:(NSString )keyPath ofObject:(id)object change:(NSDictionary )change context:(void )context {


if (context == (void )self) {


NSLog(@"Observer received notification: %@", object.name);


}


}

- (void)dealloc {


[self removeObserver:self forKeyPath:@"name"];


}


@end

int main(int argc, const char argv[]) {


@autoreleasepool {


// 创建被观察者对象


Observable observable = [[Observable alloc] init];


observable.name = @"Initial Name";



// 创建观察者对象


Observer observer = [[Observer alloc] init];



// 注册KVO


[observable addObserver:observer forKeyPath:@"name" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:(void )observer];



// 修改被观察者对象的属性,触发通知


observable.name = @"New Name";



// 取消KVO


[observable removeObserver:observer forKeyPath:@"name"];


}


return 0;


}


四、总结

本文介绍了在Objective-C中使用通知和KVO两种方式实现观察者模式。通过这两种方法,我们可以轻松地实现对象之间的依赖关系,提高代码的可维护性和可扩展性。在实际开发中,根据具体需求选择合适的方法来实现观察者模式是非常重要的。