用js代码实现观察者模式
观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知,并自动更新。观察者模式属于三种设计类型(创建型、组合型和行为型)中的行为型模式,行为型模式关注的是对象之间的通讯,观察者模式就是观察者和被观察者之间的通讯。
总结来说观察者模式有两个特点:
1.发布&订阅
2.1对N
观察者模式的现实举例
想象一下,你是一位顶尖歌手,粉丝没日没夜地询问你下个单曲什么时候发。 为了从中解放,你承诺(发布 )会在单曲发布的第一时间发给他们。你给了粉丝们一个列表。他们可以在上面填写他们的电子邮件地址,以便当歌曲发布后,让所有订阅 了的人能够立即收到。即便遇到不测,例如录音室发生了火灾,以致你无法发布新歌,他们也能及时收到相关通知。
用js代码实现观察者模式
首先先画一个 UML 简图
根据 UML 简图用js代码实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 class Subject { constructor ( ) { this .state = 0 this .observers = [] } getState () { return this .state } setState (state) { this .state = state this .notifyAllObservers() } notifyAllObservers () { this .observers.forEach(observer => { observer.update() }) } attach (observer) { this .observers.push(observer) } remove (observer) { this .observers = this .observers.filter(sub => sub !== observer) } } class Observer { constructor (name, subject ) { this .name = name this .subject = subject this .subject.attach(this ) } update () { console .log(`${this .name} update, state: ${this .subject.getState()} ` ); } } let s = new Subject()let o1 = new Observer('o1' , s)let o2 = new Observer('o2' , s)let o3 = new Observer('o3' , s)s.setState(1 ) s.setState(2 ) s.setState(3 ) s.remove(o1) s.setState(4 ) 复制代码
设计原则
主题和观察者分离,不是主动触发而是被动监听,两者解耦