观察者模式和发布订阅模式

打印 上一主题 下一主题

主题 769|帖子 769|积分 2307

观察者模式
Subject 和 Observer 直接绑定,中间无前言。如点击变乱,变乱直接和按钮进行绑定。
发布订阅模式
Publisher 和 Observer 相互不认识,中间有前言。如在 A 组件中绑定一个变乱,在 B 组件中触发这个变乱,这个两个组件相隔十万八千里互补认识,那么就通过中间event这个前言来通讯。
发布订阅模式须要在代码中触发 emit ,而观察者模式没有 emit
手写观察者模式

  1. import React, { useState, useEffect } from 'react';
  2. // 观察者函数
  3. const observer = (newValue) => {
  4.   console.log(`Subject changed to ${newValue}`);
  5. };
  6. const SubjectComponent = () => {
  7.   // 使用useState创建一个状态变量
  8.   const [subject, setSubject] = useState('Initial Value');
  9.   // 使用useEffect来模拟观察者模式
  10.   useEffect(() => {
  11.     // 当subject变化时,调用观察者函数
  12.     observer(subject);
  13.   }, [subject]); // 依赖数组中包含subject,这样每当subject变化时,useEffect都会执行
  14.   // 更新subject的方法
  15.   const updateSubject = () => {
  16.     setSubject('Updated Value');
  17.   };
  18.   return (
  19.     <div>
  20.       <p>Subject: {subject}</p>
  21.       <button onClick={updateSubject}>Update Subject</button>
  22.     </div>
  23.   );
  24. };
  25. export default SubjectComponent;
复制代码
手写发布订阅模式

  1. // EventBus.js
  2. import { createContext, useContext, useState } from 'react';
  3. const EventBusContext = createContext();
  4. export const EventBusProvider = ({ children }) => {
  5.   const [events, setEvents] = useState({});
  6.   const subscribe = (eventName, callback) => {
  7.     if (!events[eventName]) {
  8.       setEvents((prevEvents) => ({
  9.         ...prevEvents,
  10.         [eventName]: [],
  11.       }));
  12.     }
  13.     setEvents((prevEvents) => ({
  14.       ...prevEvents,
  15.       [eventName]: [...prevEvents[eventName], callback],
  16.     }));
  17.   };
  18.   const publish = (eventName, data) => {
  19.     if (events[eventName]) {
  20.       events[eventName].forEach((callback) => callback(data));
  21.     }
  22.   };
  23.   return (
  24.     <EventBusContext.Provider value={{ subscribe, publish }}>
  25.       {children}
  26.     </EventBusContext.Provider>
  27.   );
  28. };
  29. export const useEventBus = () => useContext(EventBusContext);
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

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

本版积分规则

写过一篇

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

标签云

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