美文网首页好东西程序员
二十八、观察者模式

二十八、观察者模式

作者: LeeLeCoder | 来源:发表于2017-09-14 22:06 被阅读0次

1. 何为观察者模式

观察者模式也叫做发布-订阅模式。如它的别名暗示的那样,它很像杂志的订阅。当从杂志发行商订阅杂志的时候,读者把名字和邮寄地址提供给发行商,这样新的一期就能送到读者手上了。发行商保证把正确的杂志发送到正确的地址,一般来说,读者不会收到他没有订阅的杂志。这正是订阅者模式的工作方式。

观察者通过通知器(发行商)把自己注册到(订阅)特定的通知(杂志)。当有通知的时候,观察者只从通知器得到它订阅的通知。

观察者模式的类图

Observer从Subject订阅通知,ConcreteObserver实现抽象Observer并重载其update犯法。一旦Subject的实例需要通知Observer任何新的变更,Subject会发送update消息来通知存储在内部列表中所有注册的Observer。在ConcreteObserver的update方法的实际实现中,Subject的内部状态可被取得并在以后进行处理。

观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖它的对象都的到通知并被自动更新。

在观察者模式里,一个对象在状态变化的时候会通知另一个对象。参与者并不需要知道其他对象的具体是干什么的 - 这是一种降低耦合度的设计。这个设计模式常用于在某个属性改变的时候通知关注该属性的对象。

常见的使用方法是观察者注册监听,然后再状态改变的时候,所有观察者们都会收到通知。

Cocoa 使用两种方式实现了观察者模式: NotificationKey-Value Observing (KVO)

2. 通知-Notification 和 键值观察-KVO

这里所讲的通知是基于订阅-发布模式的,即一个对象(发布者)向其他对象(订阅者)发送消息。发布者永远不需要知道订阅者的任何数据。

Apple对于通知的使用很频繁,比如当键盘弹出或者收起的时候,系统会分别发送UIKeyboardWillShowNotification/UIKeyboardWillHideNotification 的通知。当你的应用切到后台的时候,又会发送 UIApplicationDidEnterBackgroundNotification 的通知。

  • 注意:打开 UIApplication.swift 文件,在文件结尾你会看到二十多种系统发送的通知。

在 KVO 里,对象可以注册监听任何属性的变化,不管它是否持有。如果感兴趣的话,可以读一读苹果 KVO 编程指南

3. 代码实现

import Foundation

class Observer {
    func updateData(data: String) {}
}

class CourseObserver: Observer {
    override func updateData(data: String) {
        print("课程更新了---\(data)")
    }
}

class StudyObserver: Observer {
    override func updateData(data: String) {
        print("学习更新了---\(data)")
    }
}

class ObserverCenter {
    var observerMap: [String: Observer] = [:]
    
    func addObserver(observerName: String, observer: Observer) {
        observerMap[observerName] = observer
    }
    
    func deleteObserver(observerName: String) {
        observerMap.removeValue(forKey: observerName)
    }
    
    func notifyObserver(data: String) {
        for (_, value) in observerMap {
            let observer: Observer = value
            observer.updateData(data: data)
        }
    }
}

let observerCenter: ObserverCenter = ObserverCenter()

let courseObserver: CourseObserver = CourseObserver()
observerCenter.addObserver(observerName: "Course", observer: courseObserver)

let studentObserver: StudyObserver = StudyObserver()
observerCenter.addObserver(observerName: "Student", observer: studentObserver)

observerCenter.notifyObserver(data: "FlyElephant")
测试结果

相关文章

  • 11.9设计模式-观察者模式-详解

    设计模式-观察者模式 观察者模式详解 观察者模式在android中的实际运用 1.观察者模式详解 2.观察者模式在...

  • RxJava基础—观察者模式

    设计模式-观察者模式 观察者模式:观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式...

  • 前端面试考点之手写系列

    1、观察者模式 观察者模式(基于发布订阅模式) 有观察者,也有被观察者。 观察者需要放到被观察者列表中,被观察者的...

  • RxJava 原理篇

    一、框架思想 观察者模式观察者自下而上注入被观察者被观察者自上而下发射事件观察者模式 装饰器模式自上而下,被观察者...

  • 观察者模式

    观察者模式概念 观察者模式是对象的行为模式,又叫作发布-订阅(publish/subscrible)模式。 观察者...

  • 设计模式-观察者模式

    观察者模式介绍 观察者模式定义 观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为...

  • 观察者模式

    观察者模式 观察者模式的定义 观察者模式(Observer Pattern)也叫做发布订阅模式(Publish/s...

  • iOS设计模式之观察者模式

    观察者模式 1、什么是观察者模式 观察者模式有时又被称为发布(publish)-订阅(Subscribe)模式、模...

  • 观察者模式和发布订阅模式区别

    观察者模式 所谓观察者模式,其实就是为了实现松耦合(loosely coupled)。 在观察者模式中,观察者需要...

  • RxJava(二)

    一、观察者模式 1.1、传统的观察者模式 1.2、RxJava 的观察者模式 区别传统的观察者模式是一个 Obse...

网友评论

    本文标题:二十八、观察者模式

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