观察者模式的角色划分其实可以分为被观察者(目标对象)、具体被观察者、观察者(抽象)和具体观察者
接下来我们看下抽象的被观察者的定义
import UIKit
//抽象被观察者
protocol Observable {
func addObserver(observer:Observer)
func removeObserver(observer:Observer)
func notifyObserver()
func notifyObserver(msg:Any?)
func countObserver() -> Int
func setChanged()
func clearChanged()
func hasChanged() -> Bool
}
然后我们再看下具体被观察者
import Foundation
//具体被观察者
class DefaultObservable:Observable
{
private var obs = Array<Observer>()
private var changed:Bool = false
//添加观察者
func addObserver(observer:Observer)
{
self.obs.append(observer)
}
func removeObserver(observer:Observer)
{
//删除最后一个观察者
if self.obs.count != 0 {
self.obs.removeLast()
}
}
//通知观察者
func notifyObserver()
{
notifyObserver(msg: nil)
}
func notifyObserver(msg:Any?)
{
if !self.changed
{
return
}
//修改状态
self.clearChanged()
//循环通知->我们的观察者
self.obs.forEach { (o) in
o.update(obserable: self, msg: msg)
}
}
//返回观察者的数量
func countObserver()->Int
{
return self.obs.count
}
//设置状态变化
func setChanged()
{
self.changed = true
}
func clearChanged()
{
self.changed = false
}
func hasChanged()->Bool
{
return self.changed
}
}
接下来就是抽象观察者
import Foundation
//观察者
protocol Observer
{
//参数是被观察者和消息,通知观察者
func update(obserable:Observable,msg:Any?)
}
然后就是具体观察者的具体实现
import Foundation
//具体观察者
class NewsObserver:NSObject,Observer
{
func update(obserable: Observable, msg: Any?) {
print("收到了消息了:\(String(describing: msg))")
}
}
在外面的使用也比较简单,我们去创建被观察者,然后为其添加观察者以及被观察者去通知观察者消息的产生
import UIKit
//viewController也是遵守了Observer协议,然后实现代理方法
class ViewController: UIViewController,Observer {
//所以发生了变化会通知它
func update(obserable: Observable, msg: Any?) {
print("哈哈哈")
}
override func viewDidLoad() {
super.viewDidLoad()
let observer = NewsObserver()
let defaultObservable = DefaultObservable()
defaultObservable.setChanged()
//添加观察者
defaultObservable.addObserver(observer: observer)
defaultObservable.addObserver(observer: self)
defaultObservable.notifyObserver(msg: "今天你醉了吗...")
}
}