观察者模式

作者: 培枫 | 来源:发表于2018-11-18 23:46 被阅读2次

Observer pattern

The observer pattern is a software design pattern in which an object, called the subject, maintains a list of its dependents, called observers, and notifies them automatically of any state changes, usually by calling one of their methods.
The observer pattern is also a key part in the familiar model–view–controller (MVC) architectural pattern.The observer pattern is implemented in numerous programming libraries and systems, including almost all GUI toolkits.

所谓观察者模式,23 种常用设计模式之一。java 中的事件处理模型,就是基于该模式的。用于定义对象间一对多的依赖关系,使得当一个对象状态发生改变时,其他相关以来对象都得到通知并更新。java 专门提供了Observable 类用于对该模式的支持。

类图

class

Role

该模式一般包含以下角色

  • Subject: 目标、主题,它持有一个被观察者的集合,提供 add/del 方法,同时定义 notify 方法用于通知观察者
abstract class WechatOfficialAccountsSubject {
    protected val observers = mutableListOf<WechatObserver>()

    fun addObs(observer: WechatObserver) {
        observers.add(observer)
        println("${observer.getName()} followed FeiWanGe.")
    }

    fun delObs(observer: WechatObserver) {
        observers.remove(observer)
        println("${observer.getName()} unfollowed FeiWanGe")
    }

    abstract fun publish(msg: String? = null)
}
  • ConcreteSubject: 具体的被观察者对象。当该对象的状态发生改变时,会通知到各个观察者
class FeiWanGeConcreteSubject : WechatOfficialAccountsSubject() {
    override fun publish(msg: String?) {
        observers.forEach {
            it.update(msg)
        }
    }
}
  • Observer: 观察者, 一般为定义了 update 方法的接口类
interface DefaultObserver {
    fun getName(): String
    fun update(msg: String?)
}
  • ConcreteServer: 具体观察者。
class WechatObserver(private val username: String) : DefaultObserver {
    override fun getName(): String {
        return this.username
    }

    override fun update(msg: String?) {
        println("$username 已读推送 $msg")
    }
}

代码场景微解析

fun main(args: Array<String>) {
    val feiWanGe = FeiWanGeConcreteSubject()

    val puck = WechatObserver("Puck")
    val sTormSpirit = WechatObserver("STormSpirit")
    val windRunner = WechatObserver("WindRunner")

    feiWanGe.addObs(puck)
    feiWanGe.addObs(sTormSpirit)
    feiWanGe.addObs(windRunner)

    feiWanGe.publish("Observer Pattern")

    feiWanGe.delObs(sTormSpirit)
}

微信用户 Puck、STormSpirit 和 WindRunner 订阅了公众号非晚阁(貌似现在叫 非晚斋 了),之后非晚斋推送了一条更新《Observer Pattern》,各个订阅大哥都收到了该条推送,然后 STormSpirit 觉得推送很烂,就不在订阅该公众号了。

以上

日更第七日

相关文章

  • 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/wosnfqtx.html