关于javascript:从零开始理解观察者模式思否出问题了文章后一半被吞了正在重新写

6次阅读

共计 1376 个字符,预计需要花费 4 分钟才能阅读完成。

思否出问题了,写了一整天的文章,字字斟酌,段段构思,公布的时候被吞了三分之二,我心态崩了,正在疯狂码字,下次再也不必内置编辑器码字了。

零、前言

很久以前就接触过观察者模式,也写过观察者模式的文章,但以过后的程度尚不足以精确的了解这个设计模式,以至于文章写的一片凌乱。
这次再次尝试从设计模式的初衷登程,联合计算机组成原理以及理论的利用来重新学习一边观察者模式,心愿能纠正一些了解。

一、音讯告诉机制:同步和异步

无论是回调函数,还是观察者模式,它们的初衷是为了异步,开展来说就是,为了解决 并发 导致的工夫期待问题。

如果下面这句话不是很容易了解,咱们先来举个例子:

引例、IO 形式

在晚期的计算机中,当外设须要向主机发送数据时,数据会间接发送给 CPU。
此时 CPU 每隔一段时间就要查看外设的状态,每当外设准备就绪后,就会传输一次数据,如此循环,直到数据全副传输实现。
在这段查问——传输的循环中,一旦 CPU 启动 IO 过程,就只能解决这一个工作,此时如果有多个并发工作,就会全副处于期待状态,无奈及时失去解决;
此外,CPU 在一直查看外设状态时,也会耗费大量的资源。

以上这种传统的 IO 形式就称为程序查问形式,咱们能够这样了解:如果工作队列中存在多个工作,比方:


因为 CPU 同一指令周期中,只能通过程序查问形式执行 IO 或者进行运算,必须期待后面的工作完结后能力进行前面的工作,这种形式称为 同步

起初人们认为这种形式效率太低,就创造了新的传输方式——DMA 形式。

在这种形式中,CPU 不再负责理论传输的过程,而是由一个叫做 DMA 控制器的设施负责理论传输,DMA 控制器一端连贯外设,一端连贯主存,能够间接把数据从外设传到主存中。
当传输实现后,DMA 控制器会“告诉”CPU(发动 DMA 中断),来通知 CPU“数据曾经收到,你能够开始解决了”,此时 CPU 才会对这部分数据进行运算。

须要留神的是,在 DMA 形式下,CPU 曾经不负责理论传输了,因而不再轮询设施的状态,也不会因为传输数据而占用 CPU 周期,此时 CPU 真正解放出来,能够在 IO 的同时,并行的解决其余工作了。

当 IO 开始后,CPU 不用再去管 IO 状态,而是期待 IO 完结后再回来告诉 CPU,这种形式称为 异步

通过这个 IO 的例子,咱们不难发现:异步是为了解决期待的问题。

同步和异步

同步:发动申请后,必须期待后果返回后能力执行前面的操作。
异步:发动申请后不用期待后果,由另一个线程去执行申请,执行完结后,告诉次要线程。

二、观察者模式

兴许后面的例子并不是很失当,但如果看懂了下面的例子就不难发现,底层硬件和软件开发的逻辑有相通之处,在软件中,咱们也要常常解决一些“变动”的问题,当对象数据变动后,如果及时告诉其余对象更新数据呢?
请看例子:

报社的故事

有一个报社,能够向所有拜访它的读报者提供报纸,但每一次报纸更新工夫都是不确定的,读报者有若干人,如何能力保障所有的读报者都能在第一工夫收到报纸更新呢?

有一个笨办法,读报者每天去报社问一次。但问题在于,这样只能取得 24 小时内的更新,而不是立刻取得更新;
如果想减速获取更新,只能放慢拜访的频率,最终变成了读报人紧紧的盯着报社,等着报纸的更新,但这样读报人就没有方法做其余的事件了。

起初读报人有了新的方法:
他们向报社留下了联系方式,通知报社,只有有了新的报纸,就第一工夫告诉读报人。有的读报人留下了一个告诉模板

正文完
 0