观察者设计模式

写在前面

设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。当然设计模式和语言没有关系,它是一种编程思想。本篇将介绍观察者计模式(又称发布-订阅模式)的实现,以OC语言为例

详细内容

  • 对观察者模式的理解
    上面已经提到观察者模式又叫发布-订阅模式,就像杂志的订阅一样,当你订阅一本杂志时,杂志社 会记录你–订阅者的信息,当有新的被杂志更新时,你就会收到订阅的杂志。这就是观察者模式的工作原理。
  • 和代理模式的区别
    对于单一代理(就是代理类只有一个指向实体类对象的指针)来说,它反映了对象之间一对一的关联关系,和观察者有很大不同;观察者模式允许主题对象有多个观察者,这就反映出对象之间一对多的关系。
  • UML类图
    这里写图片描述
  • 具体实现步骤
    这里按照上图的步骤大体实现一下:
    • 项目结构
      这里写图片描述
      红色部分:抽象通知者和抽象观察者
      蓝色部分:抽象观察者类和具体观察者类
      抽象的一方都是协议,具体的一方遵守了对应的协议。
    • 主要代码分析
      • 抽象通知者(协议)
         
        // 抽象通知者,主要定义了,通知者的具体行为,包含了添加、移除通知者和发送通知 (尖括号用了中括号代替)
        @protocol GYAbstractSubjectProtocol [NSObject]
        -(void)attach:(id[GYAbstractObserverProtocol]) observer;
        -(void)detach:(id[GYAbstractObserverProtocol]) observer;
        -(void)notify;
      • 具体通知者(类)
         
        /* 存放观察者对象的数组/
        @property (nonatomic, strong) NSMutableArray *observers;
        // 协议中的方法实现
        -(void)attach:(id) observer
        {
        [self.observers addObject:observer];
        }
        -(void)detach:(id) observer
        {
        [self.observers removeObject:observer];
        }
        -(void)notify
        {
        // 遍历观察者数组,通知每一个观察者
        [self.observers enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        if ([obj respondsToSelector:@selector(update:)])
        {
        [obj update:@{@"OK":@"成功了!"}];
        }
        }];
        }
      • 抽象观察者(协议)
         
        // 抽象观察者
        @protocol GYAbstractObserverProtocol
        -(void)update:(NSDictionary *)dict;
        @end
      • 具体观察者(类)
         
        -(void)update:(NSDictionary *)dict
        {
        NSLog(@"%s -- %@", func, dict);
        }
    • 全部的代码

总结

这里主要简单介绍了观察者设计模式的实现,通过观察者模式,可以降低对象之间的耦合度。希望对大家有所帮助。

若大家发现错误,欢迎指正。共同交流,共同进步!谢谢阅读!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值