TypeScript实现设计模式——观察者模式

本文探讨了如何使用TypeScript实现设计模式中的观察者模式。观察者模式用于当一个对象的状态变化时通知其他对象,它在前端开发,尤其是图形界面组件中广泛应用。文章详细介绍了Subject和Observer的核心成员,包括Subject接口、具体Subject类以及Observer接口和具体Observer类,并提供了测试代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TypeScript实现设计模式——观察者模式

观察者模式是一种行为设计模式,允许一个对象将其状态的改变通知其他对象。

观察者模式提供了一种作用于任何实现了订阅者接口的对象的机制, 可对其事件进行订阅和取消订阅。

图片来源:https://refactoringguru.cn/design-patterns/observer

观察者模式是一种在前端领域应用十分广泛的设计模式,特别是在图形界面的组件中,如果你自定义了一个按钮组件,那么你很可能需要用到观察者模式。

观察者模式的核心成员有两个,一个是作为事件发布者的Subject类,另一个是作为事件接收者的Observer类。

Subject部分

Subject类所具有的公共部分是对订阅者的管理和向所有订阅者发布消息,而具体Subject所负责的业务逻辑需要放到各自的Subject类中。

Subject接口

interface Subject {
  // 添加观察者
  attach(observer: Observer): void;
  // 移除观察者
  detach(observer: Observer): void;
  // 通知所有观察者
  notify(): void;
}

具体Subject类

class ConcreteSubject implements Subject {
  // 发布者状态,测试使用
  public state: number;

  // 订阅者名单
  public observers: Array<Observer> = [];

  // 管理订阅方法
  public attach(observer: Observer): void {
    const observerIndex = this.observers.indexOf(observer);
    if (observerIndex !== -1) {
      return console.log('已订阅');
    }

    this.observers.push(observer);
    console.log('订阅成功');
  }

  public detach(observer: Observer): void {
    const observerIndex = this.observers.indexOf(observer);
    if (observerIndex === -1) {
      return console.log('订阅者未订阅');
    }

    this.observers.splice(observerIndex, 1);
    console.log('订阅者已移除');
  }

  public notify(): void {
    console.log('通知所有订阅者');
    for (const observer of this.observers) {
      observer.update(this);
    }
  }
    
  // 订阅管理以外的逻辑
  public someLogic() {
    this.state = Math.floor(Math.random() * 10 + 1);

    console.log(`我更改了我的状态:state=${this.state}`);
    this.notify();
  }
}

Observer部分

观察者只需要根据发布者的发出的消息来判断自己是否需要做出回应即可。

Observer接口

interface Observer {
  // 对发布者发出的更新消息作出回应
  update(subject: Subject): void;
}

具体Observer类

//具体观察者A
class ConcreteObserverA implements Observer {
  public update(subject: ConcreteSubject) {
    if (subject.state <= 5) {
      console.log('观察者A作出回应');
    }
  }
}

// 具体观察者B
class ConcreteObserverB implements Observer {
  public update(subject: ConcreteSubject) {
    if (subject.state > 5) {
      console.log('观察者B作出回应');
    }
  }
}

测试代码

因为是随机数,可能会得不到想要的结果,可以多尝试几次

const subject = new ConcreteSubject();

const observerA = new ConcreteObserverA();
subject.attach(observerA);

const observerB = new ConcreteObserverB();
subject.attach(observerB);

subject.someLogic();

subject.detach(observerB);

subject.someLogic();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值