写在前面
设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。当然设计模式和语言没有关系,它是一种编程思想。本篇将介绍观察者计模式(又称发布-订阅模式)的实现,以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);
}
- 抽象通知者(协议)
- 全部的代码
- 参照这里
- 项目结构
总结
这里主要简单介绍了观察者设计模式的实现,通过观察者模式,可以降低对象之间的耦合度。希望对大家有所帮助。
若大家发现错误,欢迎指正。共同交流,共同进步!谢谢阅读!