博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS开发-观察者模式
阅读量:6336 次
发布时间:2019-06-22

本文共 2541 字,大约阅读时间需要 8 分钟。

观察者模式也被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。观察者模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。iOS开发中最明显的观察者模式就是KVO键值对观察,如果对于KVC和KVO不是很熟悉,可以参考本人之前博客

关于设计模式网上的介绍多如牛毛,参考资料随手可查,简单的使用OC实现一下观察者模式,我们举一个实际工作的例子,猎头和程序员的故事,简单的就是一个猎头手里面有多个候选人的信息,一旦公司有新的工作机会,会通知所有的候选人,基于以上信息,我们通过观察者模式很容易实现。

主题对象基类:

1
2
3
4
5
6
7
8
9
@
interface 
Subject : NSObject
 
-(
void
)registerObserver:(id)observer;
 
-(
void
)deleteObserver:(id)observer;
 
-(
void
)notifyObservers;
 
@end

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
@
interface 
Subject()
 
@property  (strong,nonatomic)  NSMutableArray  *observers;
 
@end
 
@implementation Subject
 
 
-(
void
)registerObserver:(id)observer{
    
[self.observers addObject:observer];
}
 
-(
void
)deleteObserver:(id)observer{
    
[self.observers removeObject:observer];
}
 
-(
void
)notifyObservers{
    
for 
(NSInteger i=0; i<[self.observers count]; i++) {
        
Observer  *observer=(Observer *)[self.observers objectAtIndex:i];
        
[observer updateState:self observer:observer];
    
}
}
 
//getter and  setter
-(NSMutableArray *)observers{
    
if
(!_observers){
        
_observers=[[NSMutableArray alloc]init];
    
}
    
return 
_observers;
}
 
@end

猎头(Hunter)实现基类:

1
2
3
4
5
6
7
8
@implementation Hunter
 
-(
void
)updateInfo:(NSString *)personName{
    
self.personName=personName;
    
[self notifyObservers];
}
 
@end

观察者(Observer)基类:

1
2
3
4
5
@
interface 
Observer : NSObject
 
-(
void
)updateState:(id)subject  observer:(id)observer;
 
@end

程序员(Programmer)定义:

1
2
3
4
5
6
7
@
interface 
Programmer :Observer
 
@property  (strong,nonatomic) NSString  *programmerName;
 
-(instancetype)initWithName:(NSString *)name;
 
@end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@implementation Programmer
 
-(instancetype)initWithName:(NSString *)name{
    
self=[super init];
    
if 
(self) {
        
self.programmerName=name;
    
}
    
return 
self;
}
//原文地址:http://www.cnblogs.com/xiaofeixiang/
-(
void
)updateState:(id)subject observer:(id)observer{
    
NSLog(
@"伙计们,XX要招聘了,有意的赶紧联系我"
);
    
Hunter *hunter=(Hunter *)subject;
    
Programmer  *programmer=(Programmer *)observer;
    
NSLog(
@"%@---%@"
,hunter,programmer);
}
 
@end

测试观察者效果:

1
2
3
4
5
6
7
Hunter  *hunter=[[Hunter alloc]init];
Programmer *programmer=[[Programmer alloc]initWithName:
@"iOS开发工程师"
];
NSLog(
@"博客园-FlyElephant"
);
[hunter registerObserver:programmer];
[hunter updateInfo:
@"原文地址:http://www.cnblogs.com/xiaofeixiang/"
];
[hunter deleteObserver:programmer];
[hunter updateInfo:
@"iOS技术交流:228407086"
];

  

测试一切OK,如有不当,欢迎讨论~

本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/5084224.html,如需转载请自行联系原作者

你可能感兴趣的文章
Struts2中带参数的结果集
查看>>
关于json与protobuf的材料
查看>>
tree -L n
查看>>
C语言 · 明明的随机数
查看>>
Java关键字final、static使用总结
查看>>
PHPWIND和DISCUZ什么区别?
查看>>
servlet监听器
查看>>
android电池(四):电池 电量计(MAX17040)驱动分析篇【转】
查看>>
开源OSS.Social微信项目进阶介绍
查看>>
vim详解
查看>>
sql查询与修改数据库逻辑文件名,移动数据库存储路径
查看>>
dpkg命令的用法
查看>>
Kibana安装(图文详解)(多节点的ELK集群安装在一个节点就好)
查看>>
算法笔记_118:算法集训之结果填空题集二(Java)
查看>>
Win10系列:UWP界面布局基础12
查看>>
蓝牙(CoreBluetooth)-概述
查看>>
使用delphi 10.2 开发linux 上的Daemon
查看>>
LA 5009 (HDU 3714) Error Curves (三分)
查看>>
5 -- Hibernate的基本用法 --4 8 外连接抓取属性
查看>>
【OpenGL 学习笔记01】HelloWorld演示样例
查看>>