观察者模式

作者: 架构师的一小步 | 来源:发表于2019-03-07 19:02 被阅读0次

    观察者模式定义

    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.
        }
    
    
    }
    
    

    相关文章

      网友评论

        本文标题:观察者模式

        本文链接:https://www.haomeiwen.com/subject/utbqpqtx.html