思否出问题了,写了一整天的文章,字字斟酌,段段构思,公布的时候被吞了三分之二,我心态崩了,正在疯狂码字,下次再也不必内置编辑器码字了。
零、前言
很久以前就接触过观察者模式,也写过观察者模式的文章,但以过后的程度尚不足以精确的了解这个设计模式,以至于文章写的一片凌乱。
这次再次尝试从设计模式的初衷登程,联合计算机组成原理以及理论的利用来重新学习一边观察者模式,心愿能纠正一些了解。
一、音讯告诉机制:同步和异步
无论是回调函数,还是观察者模式,它们的初衷是为了异步,开展来说就是,为了解决 并发 导致的工夫期待问题。
如果下面这句话不是很容易了解,咱们先来举个例子:
引例、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 小时内的更新,而不是立刻取得更新;
如果想减速获取更新,只能放慢拜访的频率,最终变成了读报人紧紧的盯着报社,等着报纸的更新,但这样读报人就没有方法做其余的事件了。
起初读报人有了新的方法:
他们向报社留下了联系方式,通知报社,只有有了新的报纸,就第一工夫告诉读报人。有的读报人留下了一个告诉模板