为什么说:被观察者是 push 数据,迭代者是 pull 数据?

简介: 看到标题,xdm 可能有点懵?没关系,看完本篇,就会有种豁然开朗的感觉~这里的 被观察者 指的是:Observer Pattern(观察者模式)中的被观察对象;迭代者 这指的是:Iterator Pattern(迭代器模式)中的迭代对象;

image.png

看到标题,xdm 可能有点懵?没关系,看完本篇,就会有种豁然开朗的感觉~

这里的 被观察者 指的是:Observer Pattern(观察者模式)中的被观察对象;

迭代者 这指的是:Iterator Pattern(迭代器模式)中的迭代对象;


没错,接下来,将分别解析这两种模式,冲 ( ̄︶ ̄)↗ 


被观察者



观察者模式,我们总是常见:


function clickHandler(event) {
    console.log('user click!');
} 
document.body.addEventListener('click', clickHandler)


以上代码中,被观察者是 document.body,它主动注册了一个监听方法来监听点击事件,一旦发生点击,就把 event 信息带给 clickHandler 方法,然后执行;这便是观察者模式~


除了用原生 api addEventListener,其实我们也可以自己写一个更加解耦的监听方法:


class Subject { // 被观察者对象
    constructor() {
        this.listeners = []; 
    } 
    addListener(listener) { // 加入监听
        if(typeof listener === 'function') { 
            this.listeners.push(listener) 
        } else { 
            throw new Error('listener 必須是 function')
        } 
    } 
    removeListener(listener) { // 移除监听
        this.listeners.splice(this.listeners.indexOf(listener), 1) 
    } 
    notify(message) { // 发送通知
        this.listeners.forEach(listener => { 
             listener(message); 
        }) 
    } 
}


构建实例:

var sub = new Subject(); // new 一个 ob 实例
function listener1(message) { 
    console.log(message + 'from listener1'); 
} 
function listener2(message) { 
    console.log(message + 'from listener2');
} 
sub.addListener(listener1); // 加监听1
sub.addListener(listener2); // 加监听2
sub.notify('I push a commit ') // push 信息给监听器1、2


每当 notify 执行,sub 都会推送信息给 listener1 和 listener2;

被观察者会主动 push 信息(或者称为数据)给多个观察它的对象(监听器),就是典型的观察者模式。


题外说一句:很多 xd 会把【观察者模式】和【发布订阅模式】弄混,这里特意说明一下,二者区别在于:


  1. 观察者模式只需要 2 个角色便可成型,即 观察者 和 被观察者 ,其中 被观察者 是重点。
  2. 而发布订阅需要至少 3 个角色来组成,包括 发布者 、 订阅者 和 发布订阅中心 ,其中 发布订阅中心 是重点。


迭代者



JS Iterator(迭代器)我们也并不陌生,它在 ES6 被提出:


示例代码如下:

var arr = [1, 2, 3];
var iterator = arr[Symbol.iterator]();
iterator.next();
// { value: 1, done: false }
iterator.next();
// { value: 2, done: false }
iterator.next();
// { value: 3, done: false }
iterator.next();
// { value: undefined, done: true }

I

terator 最大的魅力在于 延迟计算,关于这点,在本瓜以前的文章可以找到一些相关讨论:

你觉得“惰性求值”在 JS 中会怎么实现?

听君一席话,如听一席话,解释解释“惰性求值”~


举个栗子🌰


function* getNumbers(words) {
    for (let word of words) {
      if (/^[0-9]+$/.test(word)) {
          yield parseInt(word, 10);
      }
    }
}
const iterator = getNumbers('今天是 3 月 8 号');
iterator.next();
// { value: 3, done: false }
iterator.next();
// { value: 8, done: false }
iterator.next();
// { value: undefined, done: true }


getNumbers 方法用于获取字符串里面的数字,当我们执行 iterator = getNumbers('今天是 3 月 8 号') 这一句代码时,程序并没有开始计算,直到我们逐个执行 iterator.next() 才会逐个得到运算结果。这就是延迟计算。

Iterator 就像是在 pull 数据,运行一次 .next() 就拉取一次数据;


小结



OK,结合以上代码,我们分析了 “为什么说:被观察者是 push 数据,迭代者是 pull 数据?”


一图胜千言:

image.png


不过说到底,我们为什么要把这两种设计模式单拎出来作这样解释呢?

噢,其实是为了理解 RxJS Observable,它是二者思想的结合;


它大致长这样:

var observable = Rx.Observable 
    .create(function(observer) { 
    observer.next('Jerry'); // RxJS 4.x 以前的版本用 onNext 
    observer.next('Anna'); 
})


我们后面再来逐渐揭开它的面纱~~ 这里只用先理解其背景思想,有个大致概念和印象即可;

我是掘金安东尼,输出暴露输入,技术洞见生活,再会啦~~


相关文章
|
运维 Kubernetes 容器
使用SPL快速诊断问题根因 -- 延迟分析指南
查找故障时段内系统异常根因。
1035 0
|
监控
使用云监控2.0页面诊断问题根因-错误分析指南
针对一次故障的根因诊断,通过云监控2.0调用链分析。
2686 0
|
机器学习/深度学习 人工智能 算法
GSPO:Qwen让大模型强化学习训练告别崩溃,解决序列级强化学习中的稳定性问题
这是7月份的一篇论文,Qwen团队提出的群组序列策略优化算法及其在大规模语言模型强化学习训练中的技术突破
2193 0
GSPO:Qwen让大模型强化学习训练告别崩溃,解决序列级强化学习中的稳定性问题
|
人工智能 Kubernetes Perl
2025 AI 原生编程挑战赛 术语说明与FAQ
本文档介绍了天池2025比赛的相关术语和一些疑问的解答。包括云监控平台(CloudMonitor 2.0)、日志服务(SLS)、观测数据租户(Workspace)、地域(Region)等平台与入口概念,并详解了Trace、Span、Log、Metric、Event等核心数据模型及其关键字段。文档还涵盖了PromQL告警规则、SPL日志查询、Kubernetes实体层级、诊断方法论术语等内容,同时提供了根因分析的命名规范、提交格式(JSONL)、时间窗口要求及常见问题解答,旨在帮助参赛者高效定位并解决系统故障。
1590 2
|
监控 Perl 容器
使用云监控2.0页面诊断问题根因-延迟分析指南
针对一次故障的根因诊断,云监控2.0调用链分析发现异常耗时,经排查为【checkout】服务独占耗时过长,进一步分析确认其CPU使用率突增至100%,判定根因为【checkout.cpu】性能问题。
1582 0
|
运维 监控 存储
使用SPL快速诊断问题根因 -- 错误分析指南
本内容记录了一次故障排查过程
2335 0
|
人工智能 运维 监控
2025 AI 原生编程挑战赛 数据获取文档
本文介绍了参赛者如何配置阿里云服务以参加AI运维赛。首先开通阿里云日志服务,随后创建RAM用户并为其分配访问权限。接着为该用户授权,确保其具备读取数据的权限。最后,可选地创建或重新生成AccessKey以用于后续的数据查询操作。整个流程帮助选手完成基础环境配置,以便使用阿里云日志服务进行数据分析。
2944 2
|
机器学习/深度学习 JSON 并行计算
10分钟微调,让0.6B模型媲美235B模型!免费体验进行中
本方案介绍如何通过模型蒸馏技术,利用大参数模型生成数据并微调小参数模型(如 Qwen3-0.6B),使其在特定任务(如从一句话中提取结构化信息)中达到接近大模型的效果。通过 GPU 云服务器进行高效微调,结合魔搭社区的 ms-swift 框架,用户可快速完成模型训练与部署,显著提升推理速度并降低成本。方案包含详细步骤:数据准备、模型微调、效果验证及部署建议,并提供免费试用资源,助力开发者快速上手实践。
10分钟微调,让0.6B模型媲美235B模型!免费体验进行中
|
机器学习/深度学习 人工智能 自然语言处理
【EMNLP2024】阿里云人工智能平台 PAI 多篇论文入选 EMNLP2024
阿里云人工智能平台 PAI 的多篇论文在 EMNLP2024 上入选。论文成果是阿里云与华南理工大学金连文教授团队、复旦大学王鹏教授团队共同研发。EMNLP 是人工智能自然语言处理领域的顶级国际会议,聚焦于自然语言处理技术在各个应用场景的学术研究,尤其重视自然语言处理的实证研究。该会议曾推动了预训练语言模型、文本挖掘、对话系统、机器翻译等自然语言处理领域的核心创新,在学术和工业界都有巨大的影响力。此次入选标志着阿里云人工智能平台 PAI 在自然语言处理和多模态算法能力方面研究获得了学术界认可。
|
JavaScript Linux 开发工具
如何将nodejs项目程序部署到阿里云服务器上
该文章详细描述了将Node.js项目部署到阿里云服务器的步骤,包括服务器环境配置、项目上传及使用PM2进行服务管理的过程。

热门文章

最新文章