前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >设计模式在 TypeScript 中的应用 - 观察者模式

设计模式在 TypeScript 中的应用 - 观察者模式

作者头像
三毛
发布2018-08-30 10:59:25
1.6K0
发布2018-08-30 10:59:25
举报

定义

当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知。

实现

思路:

  • 指定发布者;
  • 给发布者添加一个缓存列表,用于存放回调函数以便通知订阅者;
  • 最后发布消息的时候,发布者会遍历这个缓存列表,依次触发里面存放的订阅者回调函数。

例子:

// 发布类
class Subject {
  // 缓存列表,用以存放回调函数,以便通知订阅者
  private observers: Observer[] = new Array<Observer>()
  private state: number

  // 新增订阅者
  public subscribe (observer: Observer): void {
    this.observers.push(observer)
  }

  // 改变状态,通知订阅者
  public setState(state: number): void {
    console.log(`Warning: State changed: ${state}`)
    this.state = state
    this.publish()
  }

  // 获取状态
  public getState(): number {
    return this.state
  }

  // 发布事件
  public publish (): void {
    for (let observer of this.observers) {
      observer.update()
    }
  }

  // 取消订阅
  public unsubscribe (observer?: Observer): void {
    // 如果没传参数,则清空订阅者
    if (!observer) {
      this.observers = new Array<Observer>()
    } else {
      this.observers.splice(this.observers.indexOf(observer), 1)
    }
  }
}

// 订阅者抽象类
abstract class Observer {
  // 订阅的内容
  protected subject: Subject

  // 订阅更新
  public abstract update (): void
}

class AObserver extends Observer {
  // 构造方法里订阅
  public constructor (subject: Subject) {
    super()
    this.subject = subject
    this.subject.subscribe(this)
  }

  public update() {
    console.log(`AObserver: ${this.subject.getState()}`)
  }
}

class BObserver extends Observer {
  // 构造方法里订阅
  public constructor (subject: Subject) {
    super()
    this.subject = subject
    this.subject.subscribe(this)
  }

  public update() {
    console.log(`BObserver: ${this.subject.getState()}`)
  }
}

const subject = new Subject()

const aObserver = new AObserver(subject)
const bObserver = new BObserver(subject)

console.log('========')
console.log('State change: 100')
subject.setState(100)
console.log('========')

console.log('=========')
console.log('aObserver 取消订阅')
subject.unsubscribe(aObserver)
console.log('State change: 150')
subject.setState(150)
console.log('=========')

复制代码
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年12月23日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 定义
  • 实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档