观察者模式:

  也可以称为为 发布-订阅 模式,主要适用于多个对象依赖某一个对象的状态并,当某对象状态发生改变时,要通知其他依赖对象做出更新。是一种1对多的关系。当然,如果依赖的对象只有一个时也是一种特殊的一对一关系。通常,观察者模式适用于消息事件处理,监听者监听到事件时通知事件处理者对事件进行处理(这一点上面有点像是回调,容易与反应器模式和前摄器模式的回调搞混淆)。

Reactor模式:

  reactor模式,即反应器模式,是一种高效的异步IO模式,特征是 回调,当IO完成时,回调对应的函数进行处理。这种模式并非是真正的异步,而是运用了异步的思想,当io事件触发时,通知应用程序作出IO处理。模式本身并不调用系统的异步io函数。

Proactor模式:

  Proactor模式,即前摄器模式,也是一种高效的异步IO模式,特征也是回调,当IO事件完成时,回调对应的函数对完成事件作出处理。这种模式是真正意义上的异步,属于系统级的异步,通常要调用系统提供的异步IO函数进行IO处理。

Reactor模式和Proactor模式之间的区别:

  Reacor模式不调用系统异步IO函数,是一种仿异步。而Proactor是系统层面上的真正的异步,调用系统提供的异步IO函数。

举个例子,以网络IO为例:当我们从套接字读取数据

  1.如果是Reactor模式,那么,反应器会通知我们 “可以读取数据了”,然后调用回调函数,利用recv函数从套接字读取数据,类似于MFC中的CSocket,在我们重写OnRecieve时,内部要调用Recv函数从套接字读取数据。

  2.如果是Proactor模式,那么会先调用WSARecv函数注册读事件,反应器会通知我们 “数据已经读取了”,回调函数触发时,数据已经被接收到事先提供的缓冲区中,整个IO过程是由操作系统完成的,而不需要我们自己调用recv函数来读取数据,直接在事先提供的缓冲区取数据就可以了。(备注:Linux多路复用IO,直接将数据拷贝到指定位置,通知线程已经处理完可以直接使用)

观察者模式和Recactor模式,Proactor模式的主要区别:

  观察者模式,也叫发布-订阅模式,主要是适用于对象间一对多的依赖关系,通常用作消息分发和处理。而Reactor模式和Proactor模式主要用于高效的io模式,明显的特征是“回调”思想的运用,提高效率,避免没有必要的耗时的等待,与对象间的依赖关系无关。

来源:https://www.cnblogs.com/knight-monkey/p/Monkey_blog_201507142101.html