码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-10-14 01:55:58      阅读:448      评论:0      收藏:0      [点我收藏+]

标签:的区别   方法   一个   系统   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模式

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模式,明显的特征是“回调”思想的运用,提高效率,避免没有必要的耗时的等待,与对象间的依赖关系无关。

参考文章:

观察者设计模式(监听器的实现原理)  

观察者模式和NIO(Reactor)模式的区别

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

标签:的区别   方法   一个   系统   htm   key   发布-订阅   操作   not   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!