js观察者模式

2019-07-25 22:08  312人阅读  评论 (0)
// 通知事件类型
const EVENT_DOG_BARK = "DOG_BARK" // 狗叫

// 事件接口
class ObserverInterface {
  /*
   * 接收通知
   * event: 事件对象
   */
  notify(event) {
    throw new Error(`This method was not implemented`)
  }
}

// 事件类
class ObserverEvent {
  /*
   * 构造器
   * name: 事件名称
   * target: 触发事件对象
   */
  constructor(name, target) {
    this.name = name
    this.target = target
  }
}

// 主人
class Master extends ObserverInterface {
  // 构造器
  constructor(name) {
    super()
    // 名子
    this.name = name
  }

  /*
   * 接收通知
   * event: 事件对象
   */
  notify(event) {
    // 检测事件类型
    if (event.name === EVENT_DOG_BARK) {
      console.log(`${this.name}: My dog is barking! What happened?`)
    }
  }
}

// 贼 小偷
class Thief extends ObserverInterface {
  // 构造器
  constructor(name) {
    super()
    // 名子
    this.name = name
  }

  /*
   * 接收通知
   * event: 事件对象
   */
  notify(event) {
    // 检测事件类型
    if (event.name === EVENT_DOG_BARK) {
      console.log(`${this.name}: The dog is barking. I've been found! Run!`)
    }
  }
}

// 狗叫
class Dog {
  // 构造器
  constructor(name) {
    // 名子
    this.name = name
    // 观察者 订阅者
    this.observers = []
  }

  // 注册观察者
  register(observer) {
    if (observer instanceof ObserverInterface) {
      this.observers.push(observer)
    }
  }

  // 叫
  bark() {
    // 业务逻辑
    console.log(`${this.name}: Dog bark!`)

    // 事件对象
    var event = new ObserverEvent(EVENT_DOG_BARK, this)
    // 通知所有观察者
    for (var i = 0; i < this.observers.length; i++) {
      // 获取观察者
      var observer = this.observers[i]
      // 通知观察者
      observer.notify(event)
    }
  }
}

// main逻辑

// 创建角色对象
// 狗 阿黄
var dog = new Dog("阿黄")
// 主人 张三
var master = new Master("张三")
// 贼1 李四
var thief1 = new Thief("李四")
// 贼2 王五
var thief2 = new Thief("王五")

// 注册观察者
dog.register(master) // 主人
dog.register(thief1) // 贼1
dog.register(thief2) // 贼2

// 狗发现了小偷
dog.bark()