前端开发的观察者模式

星球的眼睛  金牌会员 | 2024-9-11 12:46:09 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 576|帖子 576|积分 1728

什么是观察者计划模式

观察者模式(Observer Pattern)是前端开发中常用的一种计划模式。它界说了一种一对多的依赖关系,使得当一个对象的状态发生改变时,其所有依赖对象都能收到通知并自动更新。观察者模式广泛应用于事件驱动的体系,如浏览器事件、发布-订阅体系,以及各类框架的状态管理机制。
观察者计划模式界说了一种 一对多 的依赖关系,当 一个对象的状态发生变化 时,所有依赖它的对象都会自动收到通知。这种模式可以解耦观察者和被观察者,使得它们可以独立变化。
观察者模式的关键脚色:

  • Subject(被观察者): 负责维护观察者列表,并在自身状态发生变化时通知所有观察者。
  • Observer(观察者): 订阅目标的变化,并在收到通知时执行相关利用。
观察者模式的实现

1. 简单观察者模式

  1. // 观察者接口
  2. interface Observer {
  3.   update(state: string): void;
  4. }
  5. // 被观察者
  6. class Subject {
  7.   private observers: Observer[] = [];
  8.   private state: string = '';
  9.   // 添加观察者
  10.   public attach(observer: Observer): void {
  11.     this.observers.push(observer);
  12.   }
  13.   // 移除观察者
  14.   public detach(observer: Observer): void {
  15.     this.observers = this.observers.filter(obs => obs !== observer);
  16.   }
  17.   // 通知所有观察者
  18.   public notify(): void {
  19.     this.observers.forEach(observer => observer.update(this.state));
  20.   }
  21.   // 改变状态并通知观察者
  22.   public setState(state: string): void {
  23.     this.state = state;
  24.     this.notify();
  25.   }
  26. }
  27. // 具体的观察者
  28. class ConcreteObserver implements Observer {
  29.   private name: string;
  30.   constructor(name: string) {
  31.     this.name = name;
  32.   }
  33.   // 收到通知时的动作
  34.   public update(state: string): void {
  35.     console.log(`${this.name} received update: ${state}`);
  36.   }
  37. }
  38. // 测试观察者模式
  39. const subject = new Subject();
  40. const observer1 = new ConcreteObserver('Observer 1');
  41. const observer2 = new ConcreteObserver('Observer 2');
  42. subject.attach(observer1);
  43. subject.attach(observer2);
  44. subject.setState('State A');
  45. subject.setState('State B');
复制代码

在这个例子中,我们实现了基本的观察者模式:一个 Subject 类可以被多个 Observer 观察,每当 Subject 的状态发生变化时,它会通知所有观察者。
2. 发布-订阅模式

发布-订阅模式(Publish-Subscribe Pattern) 是观察者模式的一种变体,通常通过事件体系来实现。发布者不直接通知观察者,而是通过中介(消息中心)将事件广播出去,由订阅者选择性地接收。
  1. // 消息中心
  2. class EventEmitter {
  3.   private events: { [key: string]: Function[] } = {};
  4.   // 订阅事件
  5.   public subscribe(event: string, listener: Function): void {
  6.     if (!this.events[event]) {
  7.       this.events[event] = [];
  8.     }
  9.     this.events[event].push(listener);
  10.   }
  11.   // 发布事件
  12.   public publish(event: string, data?: any): void {
  13.     if (this.events[event]) {
  14.       this.events[event].forEach(listener => listener(data));
  15.     }
  16.   }
  17.   // 取消订阅
  18.   public unsubscribe(event: string, listener: Function): void {
  19.     if (this.events[event]) {
  20.       this.events[event] = this.events[event].filter(l => l !== listener);
  21.     }
  22.   }
  23. }
  24. // 测试发布-订阅模式
  25. const eventEmitter = new EventEmitter();
  26. const handler = (data: any) => console.log('Event received:', data);
  27. // 订阅事件
  28. eventEmitter.subscribe('eventA', handler);
  29. // 发布事件
  30. eventEmitter.publish('eventA', { message: 'Hello, World!' });
  31. // 取消订阅
  32. eventEmitter.unsubscribe('eventA', handler);
复制代码
在发布-订阅模式中,发布者和订阅者是通过 EventEmitter 消息中心举行通讯的,发布者无需知道订阅者的存在,这使得它们之间的耦合度进一步低落。
3. 双向绑定模式(MVVM)

MVVM(Model-View-ViewModel) 是一种常见的双向绑定模式,在前端框架如 VueAngular 中很常见。它通过数据绑定使得 View 和 Model 可以双向通讯,通常是通过一个 ViewModel 来桥接二者。
  1. // ViewModel
  2. class ViewModel {
  3.   private state: string = '';
  4.   private observers: Function[] = [];
  5.   // 获取当前状态
  6.   public getState(): string {
  7.     return this.state;
  8.   }
  9.   // 设置状态并通知视图更新
  10.   public setState(newState: string): void {
  11.     this.state = newState;
  12.     this.notify();
  13.   }
  14.   // 添加视图更新的回调
  15.   public bind(observer: Function): void {
  16.     this.observers.push(observer);
  17.   }
  18.   // 通知视图更新
  19.   private notify(): void {
  20.     this.observers.forEach(observer => observer(this.state));
  21.   }
  22. }
  23. // 视图更新函数
  24. const updateView = (state: string) => {
  25.   console.log('View updated:', state);
  26. };
  27. // 测试双向绑定
  28. const viewModel = new ViewModel();
  29. viewModel.bind(updateView);
  30. viewModel.setState('New State');
  31. console.log('Current State:', viewModel.getState());
复制代码
在这个例子中,ViewModel 充当了模型和视图之间的桥梁,确保视图在数据更新时实时反应。这是 MVVM 模式的一个简单实现。
总结

观察者计划模式及其变体在前端开发中起着至关重要的作用。通过观察者模式,可以解耦对象之间的直接依赖关系,从而提升体系的机动性和可维护性。无论是基础的观察者模式,还是更为复杂的发布-订阅模式、双向绑定模式,都在差别的场景中发挥了不可替代的作用。
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

星球的眼睛

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表