观察者模式Swift版

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: "发送通知")

    }


GIT_Demo代码




猜你喜欢

转载自blog.csdn.net/tiantianios/article/details/78151491
今日推荐