观察者模式应该是比较好理解的,适用的场景为 某一个事件发生,需要执行一些列的行为。消息和订阅
监听模式
监听模式又名观察者模式,顾名思意就是观察与被观察的关系,比如你在烧开水得时时看着它开没开,你就是观察者,水就是被观察者;再比如说你在带小孩,你关注她是不是饿了,是不是喝了,是不是撒尿了,你就是观察者,小孩就是被观察者。
观察者模式是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。当你看这些模式的时候,不要觉得陌生,它们就是观察者模式。
观察者模式一般是一种一对多的关系,可以有任意个(一个或多个)观察者对象同时监听某一个对象。监听的对象叫观察者(后面提到监听者,其实就指观察者,两者是等价的),被监听的对象叫被观察者(Observable,也叫主题 Subject)。被观察者对象在状态或内容发生变化时,会通知所有观察者对象,使它们能够做出相应的变化(如自动更新自己的信息)。
比如:
上课铃响起, 学生ABCDEF走向课堂, 老师ABCEDF走向课堂。
图片.png
元素:
- Observable: 可以被观察的对象,是发布消息的主体,内部维护Observer的列表。可以自主决定什么时候发送消息notify,以及消息数据
- Observer: 观察者,是消息的接收方,当收到Observable发送的消息,执行对应的Update。
使用:
Observable、Observer作为基类,子类Observer确定update的操作。
现实中很少直接这样使用,因为这样就强制继承,很多语言都是单继承,update也只能由一个操作,限制性很强。
目前存在EventEmit、Signals、UI事件机制都应该理解为观察者的变种,将观察的消息发送和接收专门使用一套机制,这套机制可以作为组件,包含在使用的主体之中,避免继承和依赖。
微软的Rx系列RxJava、RxJs是一个极端的观察者架构,呈现了函数式编程的威力,将异步的回调写成线性结构,方便理解和维护。
感想:
新加一个元素
- Subscription: 一个注册的行为可以抽象成一个订阅,订阅可以独自维护自己的生命周期。
记住Observable、Observer更为重要,当代码有类似的消息机制,可以考虑使用,但是更为推荐使用早已成熟的消息事件框架,代码简单易于维护扩展。
网友评论