iOS设计模式之观察者模式

本文深入探讨了iOS中观察者模式的应用,通过实例讲解如何利用NSNotificationCenter实现对象间解耦,确保界面与数据独立,降低耦合度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于最近在iOS学习中对观察者模式有些自己的见解,故发博文进行总结。如有错误还请各位指出并海涵。

  1. 在这个设计模式下。有至少两组对象–观察者与被观察者。观察者负责观察数据的改变,当被观察者的数据发生改变的时候,观察者就会发现相应的改变,并作出相应的响应。这种模式能够确保界面与数据之间的独立性,降低其中的耦合度。
  2. 在通知中,接受通知的相当于一个观察者,发送通知的相当于一个被观察者。当接受通知的人接收到发送通知的人的通知的时候,相当于观察者发现被观察者的数据发生了改动。这个时候观察者开始对被观察者修改数据的行为作出相应。
  3. 观察者和被观察者之间不会主动的进行交流,防止两者之间紧耦合。需要用一个第三方对象来对其进行管理。因为根据面向对象的思想。每一个类应该只负责他这个类应该实现的功能,而不是雨露均沾。在这里,NSNotificationCenter 充当通知的管理者,所有的通知的发送到接收都由他来管理。发送者只负责通知的打包发送,接收者只负责通知的接收。
  4. 在通知这个设计模式中,必须保证先有人监听,后有人发送。因为发送只是对有监听需要的对象进行发送。不会对没有监听需求的对象发送信息。

例如:一个发送与接收的简单demo

main.m
#import <Foundation/Foundation.h>
#import "Listener.h"
#import "Sender.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Listener *listener = [[Listener alloc] init];
        Sender *sender = [[Sender alloc] init];
        NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
        NSString *notificationName = @"精选";
        // 注意:在这里面,先要向 center 注册一个观察者,告诉 center 你对 notification 感兴趣,center 才会对你推送通知,否则不推送。
        [center addObserver:listener selector:@selector(message) name:notificationName object:sender];
        [center postNotificationName:notificationName object:sender userInfo:@{@"今日大事": @"某人发现一个新星球", @"新闻" : @"皇马欧冠三连冠"}];
    }
    return 0;
}

发送者类

Sender.h
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface Sender : NSObject
//sender的姓名
@property (nonatomic, copy) NSString *name;
@end
NS_ASSUME_NONNULL_END
sender.m
#import "Sender.h"
@implementation Sender
@end

接收者类

Listener.h
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface Listener : NSObject
// Listener的姓名
@property (nonatomic, copy) NSString *name;
- (void)message;
@end
NS_ASSUME_NONNULL_END
Listener.m
#import "Listener.h"
@implementation Listener
- (void)message {
    NSLog(@"发送者发信息了");
}
// 注意:Listener 的 dealloc 方法不要忘了重写,因为当他不当监听者的时候,再调用这个对象方法的时候,会出现僵尸对象。addObserver方法一个包含了一个已删除的对象。
- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
}
@end

实现结果

2018-11-10 19:16:54.715895+0800 观察者模式[2476:233294] 发送者发信息了
Program ended with exit code: 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值