1、观察者模式定义?
当一个对象状态发生改变,所有依赖于他订阅者都会发生改变(收到状态改变的通知)。
2、观察者模式-应用场景?
场景一:关联场景
场景二:事件多级触发
场景三:跨系统消息交互场景
3、观察者模式-角色划分?
四个角色?
角色一:被观察者(目标对象->抽象)
角色二:具体被观察者(目标对象)
角色三:观察者
角色四:具体观察者
代码示例:
import UIKit
//抽象被观察者
class Observable: NSObject {
//观察者数组
private var obs:Array<Observer>?
override init() {
super .init()
self.obs =Array<Observer>()
}
//注册观察者
func addObserver(o:Observer) {
obs?.append(o)
}
//取消观察者
func cancelObserver(o:Observer){
obs?.removeLast()
}
//取消所有观察者
func cancelAllObservers(o:Observer){
obs?.removeAll()
}
//获得所有观察者
func countObservers()->Int {
return (self.obs?.count)!
}
//发送通知
func notifyObservers() {
notifyObservers(msg:nil)
}
func notifyObservers(msg:Any?) {
self.obs?.forEach({ (o)in
o .update(o: self, msg: msg)
})
}
}
观察者协议:
import Foundation
protocol Observer {
//收到通知
func update(o:Observable,msg:Any?)
}
具体观察者1:
import UIKit
//具体观察者1
class SpecificObserver1: Observer {
func update(o: Observable, msg: Any?) {
if msg != nil{
print("具体观察者1收到 \(String(describing: msg!))")
}
}
}
具体观察者2:
import UIKit
class SpecificObserver2: Observer {
func update(o: Observable, msg: Any?) {
if msg != nil{
print("具体观察者2收到 \(String(describing: msg!))")
}
}
}
测试代码调用:
func demo1() {
let observable = Observable()
let specificObserver1 = SpecificObserver1()
let specificObserver2 = SpecificObserver2()
observable.addObserver(o: specificObserver1)
observable.addObserver(o: specificObserver2)
observable.notifyObservers(msg: "发送通知")
}