当前位置: 首页 > Web前端 > JavaScript

从零开始,理解观察者模式(思路有问题,文章后半部分吞了,正在重写)

时间:2023-03-27 14:53:15 JavaScript

思路有问题,写了一整天的文章,认真每一个字都斟酌着,一段一段地想着,放出来的时候吞了三分之二,心态崩了,疯狂打字。下次再也不会用内置编辑器打字了。零,前言很早以前就接触过观察者模式,也写过关于观察者模式的文章,但是当时的水平还不足以准确理解这种设计模式,所以文章的写法很混乱。这次再次尝试从设计模式的初衷出发,结合计算机组成原理和实际应用重新学习观察者模式,希望能纠正一些理解。1、消息通知机制:同步和异步无论是回调函数还是观察者模式,它们的初衷都是异步的。扩展一下,就是解决并发带来的时间等待问题。如果上面这句话不好理解,我们先举个例子:引用,IO模式在早期的计算机中,当外围设备需要向主机发送数据时,会直接将数据发送给CPU。这时候CPU就得每隔一段时间检查一下外设的状态,当外设准备好后,再传输一次数据,以此类推,直到所有的数据传输完成。在这个query-transmission循环中,CPU一旦启动IO进程,就只能处理这个task了。如果此时有多个并发任务,它们都会处于等待状态,无法及时处理;在不断检查外围设备的状态时,它也会消耗大量资源。上述传统的IO方式称为程序查询方式。我们可以这样理解:如果任务队列中有多个任务,例如:因为CPU在同一个指令周期内只能通过程序查询的方式进行IO或计算,所以必须等待前面的工作完成后才可以可以进行后续工作。这种方法称为同步。后来人们认为这种方式效率太低,于是发明了一种新的传输方式——DMA方式。在这种方法中,CPU不再负责实际的传输过程,而是由一个称为DMA控制器的设备负责实际的传输。DMA控制器一端连接外围设备,另一端连接主存,可以直接将数据从外围设备传输到主存。当传输完成后,DMA控制器会“通知”CPU(发起DMA中断)告诉CPU“数据已经收到,可以开始处理了”,然后CPU就会对这部分进行操作的数据。需要注意的是,在DMA模式下,CPU不再负责实际的传输,因此不再轮询设备的状态,CPU周期也不会被数据的传输占用。这时候CPU真正解放了,可以同时进行IO了。,并行处理其他任务。当IO开始时,CPU不必管理IO状态,而是等待IO结束后再返回通知CPU。这种方法称为异步。通过这个IO例子不难发现,异步就是为了解决等待的问题。同步与异步同步:发起请求后,必须等待返回结果才能进行后续操作。异步:发起请求后,不需要等待结果。另一个线程执行请求,执行完成后通知主线程。2.观察者模式可能前面的例子不是很贴切,但是如果你理解了上面的例子,不难发现底层硬件和软件开发的逻辑有一些共同点。在软件中,我们也经常要处理一些“变化”的问题,当对象数据发生变化时,如何及时通知其他对象更新数据?请看例子:报社的故事。有报社,可以为所有到访的读者提供报纸,但每份报纸的更新时间不定。有几个读者。我们如何确保所有读者?你能尽快收到报纸更新吗?有一个笨办法,报社读者每天去报社问一次。但问题是你只能获取24小时内的更新,而不是立即获取更新;想要加快更新速度,就只能加快访问频率,最后变成了一个盯着报社,等待报纸更新的看报人,但是看报人却没有办法做其他事情。后来,读者们有了新的办法:他们把自己的联系方式留给了报社,告诉报社,只要有新报纸,就会第一时间通知读者。部分报刊读者留下的告示模板