基于观察者模式的设计

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

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

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: "今天你醉了吗...")
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值