基于观察者模式的设计

观察者模式的角色划分其实可以分为被观察者(目标对象)、具体被观察者、观察者(抽象)和具体观察者

接下来我们看下抽象的被观察者的定义

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: "今天你醉了吗...")
    }
}

猜你喜欢

转载自blog.csdn.net/zcmuczx/article/details/81049976
今日推荐