iOS设计模式之观察者模式
2017-05-24 本文已影响39人
3697d6c42285
观察者模式
1、什么是观察者模式
观察者模式有时又被称为发布(publish)-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式。
在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
观察者模式由三个角色组成:
- 观察者
- 被观察者
- 接收者
当开始观察的时候,观察者就需要盯着被观察者,当被观察者发生变化的时候,都需要反馈消息给接收者。在 iOS 中,系统已经实现了 KVO 和通知两种观察者模式。
2、观察者模式用在什么地方
- 当一个对象发生改变的时候,需要将它的变化进行反馈
当开始监听的时候,就需要把所有的改变反馈,直到取消监听。
3、观察者模式的使用
- 创建被观察者类,实现增加监听、移除监听的功能
- 创建观察者类,实现被观察者监听前后监听后的值,并反馈给接受这
- 接受者接受监听值。
4、总结
在 iOS 中经常使用 KVO 实现观察者,KVO 的使用比较少,但是属于苹果黑魔法之一,有很好的借鉴作用,值得去看一看。
而 iOS 中另外一个经常用来实现观察者的是通知,但是建议不要滥用。
这两种都是在 set 的时候进行监听处理。也是一般观察者实现的原理。
5、demo
class Subject: NSObject {
let ObserArray :NSMutableArray = {NSMutableArray()}()
var name: String? {
willSet {
for obe in self.ObserArray {
if (obe as! Obser).key == "name" {
(obe as! Obser).willChangeValue = newValue
}
}
}
didSet {
for obe in self.ObserArray {
if (obe as! Obser).key == "name" {
(obe as! Obser).didChangedValue = self.name
self.notify(obe: obe as! Obser)
}
}
}
}
func addObser(obe:Obser, key:String) {
if !self.ObserArray.contains(obe) {
self.ObserArray.add(obe)
obe.key = key
}
}
func removeObser(obe:Obser) {
if self.ObserArray.contains(obe) {
self.ObserArray.remove(obe)
}
}
func removeAllObser() {
self.ObserArray.removeAllObjects()
}
func notify(obe:Obser) {
print(obe,obe.key!,obe.willChangeValue!,obe.didChangedValue!)
}
}
class Obser: NSObject {
var key: String?
var willChangeValue: Any?
var didChangedValue: Any?
}