Swift_VIP专场汇总iOS学习ios实用开发技巧

iOS设计模式之观察者模式

2017-05-24  本文已影响39人  3697d6c42285

观察者模式

1、什么是观察者模式

观察者模式有时又被称为发布(publish)-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式。

在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。

观察者模式由三个角色组成:

  1. 观察者
  2. 被观察者
  3. 接收者

当开始观察的时候,观察者就需要盯着被观察者,当被观察者发生变化的时候,都需要反馈消息给接收者。在 iOS 中,系统已经实现了 KVO通知两种观察者模式。

2、观察者模式用在什么地方

当开始监听的时候,就需要把所有的改变反馈,直到取消监听。

3、观察者模式的使用

  1. 创建被观察者类,实现增加监听、移除监听的功能
  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?
}
上一篇 下一篇

猜你喜欢

热点阅读