标签:的区别 方法 一个 系统 htm key 发布-订阅 操作 not
定义主题对象接口
/**抽象主题角色: 这个主题对象在状态上发生变化时,会通知所有观察者对象 也叫事件对象 */ public interface Subject { //增加一个观察者 public void addWatcher(Watcher watcher); //删除一个观察者 public void removeWatcher(Watcher watcher); //通知所有的观察者 public void notifyWatchers(String str); }
实现类
public class SubjectImpl implements Subject{ //创建一个队列来存储一个或多个观察者 private ArrayList<Watcher> al= new ArrayList<Watcher>(); @Override public void addWatcher(Watcher watcher) { al.add(watcher);//添加观察者到指定队列中 } @Override public void removeWatcher(Watcher watcher) { al.remove(watcher);//从队列中删除观察者 } @Override public void notifyWatchers(String str) { //遍历队列 for(int i=0;i<al.size();i++){ Watcher watcher = al.get(i);//获取队列中的观察者对象 watcher.update(str);//调用它的update()方法 } } }
观察者(监听器)接口
观察者接口
public interface Watcher { //更新自己 public void update(String str); }
观察者实现类
public class WatcherImpl implements Watcher{ @Override public void update(String str) { System.out.println("已经收到通知:"+str); } }
测试
public class ClientTest { public static void main(String[] args){ //创建被观察者对象 SubjectImpl subject = new SubjectImpl(); //创建观察者 WatcherImpl watcher1 = new WatcherImpl(); WatcherImpl watcher2 = new WatcherImpl(); WatcherImpl watcher3 = new WatcherImpl(); //添加多个观察者 subject.addWatcher(watcher1); subject.addWatcher(watcher2); subject.addWatcher(watcher3); //通知观察者 subject.notifyWatchers("你好!"); //分割 System.out.println("--------------------------------"); //删除一个观察者 subject.removeWatcher(watcher1); //再次通知观察者 subject.notifyWatchers("很好!"); } }
观察者模式:也可以称为为 发布-订阅 模式。
主要适用于多个对象依赖某一个对象的状态并,当某对象状态发生改变时,要通知其他依赖对象做出更新。
是一种1对多的关系。当然,如果依赖的对象只有一个时也是一种特殊的一对一关系。
通常,观察者模式适用于消息事件处理,监听者监听到事件时通知事件处理者对事件进行处理(这一点上面有点像是回调,容易与反应器模式和前摄器模式的回调搞混淆)。
reactor模式,即反应器模式,是一种高效的异步IO模式,特征是 回调,当IO完成时,回调对应的函数进行处理。
这种模式并非是真正的异步,而是运用了异步的思想,当io事件触发时,通知应用程序作出IO处理。
模式本身并不调用系统的异步io函数。
Proactor模式,即前摄器模式,也是一种高效的异步IO模式,特征也是回调,
当IO事件完成时,回调对应的函数对完成事件作出处理。
这种模式是真正意义上的异步,属于系统级的异步,通常要调用系统提供的异步IO函数进行IO处理。
Reacor模式不调用系统异步IO函数,是一种仿异步。而Proactor是系统层面上的真正的异步,调用系统提供的异步IO函数。
举个例子,以网络IO为例:当我们从套接字读取数据
1.如果是Reactor模式,那么,反应器会通知我们 “可以读取数据了”,然后调用回调函数(没有新开线程),利用recv函数从套接字读取数据,类似于MFC中的CSocket,在我们重写OnRecieve时,内部要调用Recv函数从套接字读取数据。
2.如果是Proactor模式,那么会先调用WSARecv函数注册读事件,反应器会通知我们 “数据已经读取了”,回调函数触发时,数据已经被接收到事先提供的缓冲区中(新开的一个线程),整个IO过程是由操作系统完成的,而不需要我们自己调用recv函数来读取数据,直接在事先提供的缓冲区取数据就可以了。
观察者模式,也叫发布-订阅模式,主要是适用于对象间一对多的依赖关系,通常用作消息分发和处理。而Reactor模式和Proactor模式主要用于高效的io模式,明显的特征是“回调”思想的运用,提高效率,避免没有必要的耗时的等待,与对象间的依赖关系无关。
参考文章:
JAVA设计模式——观察者设计模式和Reactor反应堆设计模式
标签:的区别 方法 一个 系统 htm key 发布-订阅 操作 not
原文地址:https://www.cnblogs.com/ssskkk/p/9703926.html