被观察者(主题)接口
定义主题对象接口
/**抽象主题角色: 这个主题对象在状态上发生变化时,会通知所有观察者对象
也叫事件对象*/
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