java 反应堆模式_JAVA设计模式——观察者设计模式和Reactor反应堆设计模式

被观察者(主题)接口

定义主题对象接口

/**抽象主题角色: 这个主题对象在状态上发生变化时,会通知所有观察者对象

也叫事件对象*/

public interfaceSubject {//增加一个观察者

public voidaddWatcher(Watcher watcher);//删除一个观察者

public voidremoveWatcher(Watcher watcher);//通知所有的观察者

public voidnotifyWatchers(String str);

}

实现类

public class SubjectImpl implementsSubject{//创建一个队列来存储一个或多个观察者

private ArrayList al= new ArrayList();

@Overridepublic voidaddWatcher(Watcher watcher) {

al.add(watcher);//添加观察者到指定队列中

}

@Overridepublic voidremoveWatcher(Watcher watcher) {

al.remove(watcher);//从队列中删除观察者

}

@Overridepublic voidnotifyWatchers(String str) {//遍历队列

for(int i=0;i

Watcher watcher= al.get(i);//获取队列中的观察者对象

watcher.update(str);//调用它的update()方法

}

}

}

观察者(监听器)接口

观察者接口

public interfaceWatcher {//更新自己

public voidupdate(String str);

}

观察者实现类

public class WatcherImpl implementsWatcher{

@Overridepublic voidupdate(String str) {

System.out.println("已经收到通知:"+str);

}

}

测试

public classClientTest {public static voidmain(String[] args){//创建被观察者对象

SubjectImpl subject = newSubjectImpl();//创建观察者

WatcherImpl watcher1 = newWatcherImpl();

WatcherImpl watcher2= newWatcherImpl();

WatcherImpl watcher3= newWatcherImpl();//添加多个观察者

subject.addWatcher(watcher1);

subject.addWatcher(watcher2);

subject.addWatcher(watcher3);//通知观察者

subject.notifyWatchers("你好!");//分割

System.out.println("--------------------------------");//删除一个观察者

subject.removeWatcher(watcher1);//再次通知观察者

subject.notifyWatchers("很好!");

}

}

观察者模式:也可以称为为 发布-订阅 模式。

主要适用于多个对象依赖某一个对象的状态并,当某对象状态发生改变时,要通知其他依赖对象做出更新。

是一种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函数来读取数据,直接在事先提供的缓冲区取数据就可以了。

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

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

参考文章:

原文:https://www.cnblogs.com/ssskkk/p/9703926.html

你可能感兴趣的:(java,反应堆模式)