Javascript设计模式-观察者模式

2019-10-15  本文已影响0人  宣大头

特点

1.发布/订阅的关系(但是它和发布订阅模式不是一样的,谨记)

2.一对N

//观察者模式js代码示例

//主题

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)

  }

}

//观察者

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 subject = new Subject()

let o1 = new Observer('o1', subject)

let o2 = new Observer('o2', subject)

let o3 = new Observer('o3', subject)

subject.setState(1)

subject.setState(2)

subject.setState(3)

写到这里,我突然发现观察者模式代码有点耦合,俗称轻耦合,然后我很自觉的去百度了一下,怎么样实现完全解耦呢,百度告诉我答案,下面简单介绍一下:

观察者模式虽然有发布订阅这种类似的关系,但是和正在的发布订阅其实是不一样的,真正的发布订阅是完全解耦;意思是观察者模式有两个对象一个观察者一个被观察者,两个直接接触,但是真正的发布订阅其实还有个代理人,俗称Broker(经理人),举个比较庸俗的例子:

观察者模式就是男的出轨,两个女的直接对决,发布订阅就是男的在中间调解,哈哈,有点垃圾~

上一篇 下一篇

猜你喜欢

热点阅读