观察者模式定义
1.当一个对象的状态发生改变的时候,所有依赖于他的订阅者都会收到通知。
观察者模式应用场景
场景一:关联行为场景
场景二:事件多级触发场景
场景三:跨系统消息交互场景(例如消息队列、事件主线)
观察者模式角色划分
角色一:被观察者(目标对象)
角色二:具体被观察者
角色三:观察者(抽象)
角色四:具体观察者
观察者模式和代理的区别
1.观察者模式的回调的方法是同一个
2.代理的回调方法是不定的
观察者模式原理案例
//
// Student.swift
// Dream_20180713_Obsever
//
// Created by Dream on 2018/7/13.
// Copyright © 2018年 Tz. All rights reserved.
//
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
}
//
// NSLogStudentObserable.swift
// Dream_20180713_Obsever
//
// Created by Dream on 2018/7/13.
// Copyright © 2018年 Tz. All rights reserved.
//
import UIKit
//具体被观察者->NSLog同学(抽象出来->统一管理)(万能)
class DefaultObserable: Observable {
private var obs = Array<Observer>()
private var changed:Bool = false
func addObserver(observer:Observer){
self.obs.append(observer)
}
func removeObserver(observer:Observer){
//指定删除
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
}
}
//
// Observer.swift
// Dream_20180713_Obsever
//
// Created by Dream on 2018/7/13.
// Copyright © 2018年 Tz. All rights reserved.
//
import UIKit
//观察者
protocol Observer {
func update(obserable:Observable, msg:Any?)
}
//
// NewsObserver.swift
// Dream_20180713_Obsever
//
// Created by Dream on 2018/7/13.
// Copyright © 2018年 Tz. All rights reserved.
//
import UIKit
//具体观察者(新闻)
class NewsObserver: NSObject, Observer {
func update(obserable: Observable, msg: Any?) {
print("NSLog同学收到了新闻消息: \(String(describing: msg))")
}
}
//
// ViewController.swift
// Dream_20180713_Obsever
//
// Created by Dream on 2018/7/13.
// Copyright © 2018年 Tz. All rights reserved.
//
import UIKit
class ViewController: UIViewController, Observer {
override func viewDidLoad() {
super.viewDidLoad()
//被观察者
let observer = NewsObserver()
//具体被观察者
let defaultOb = DefaultObserable()
//线程安全你也可以优化
//具体观察者状态发生改变
defaultOb.setChanged()
//传入被观察者
defaultOb.addObserver(observer: self)//当前类调用update
defaultOb.addObserver(observer: observer)//被观察者调用方法
//具体实现
defaultOb.notifyObserver(msg: "海南的妹子比较漂亮...可以去看看...")
//观察者模式实现->系统类似的实现
//其他语言观察者模式->差不多
}
func update(obserable: Observable, msg: Any?) {
print("NSError同学收到了新闻消息: \(String(describing: msg))")
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
网友评论