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

被观察者(主题)接口

定义主题对象接口

/**抽象主题角色: 这个主题对象在状态上发生变化时,会通知所有观察者对象
      也叫事件对象
 */
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)模式的区别

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

时间: 2024-08-28 16:48:31

JAVA设计模式——观察者设计模式和Reactor反应堆设计模式的相关文章

初探Java设计模式4:JDK中的设计模式

JDK中设计模式 本文主要是归纳了JDK中所包含的设计模式,包括作用和其设计类图.首先来个总结,具体的某个模式可以一个一个慢慢写,希望能对研究JDK和设计模式有所帮助.一.设计模式是什么(1)反复出现问题的解决方案(2)增强软件的灵活性(3)适应软件不断变化二.学习JDK中设计模式的好处(1)借鉴优秀代码的设计,有助于提高代码设计能力(2)JDK的设计中体现了大多数设计模式,是学习设计模式的较好的方式(3)可以更加深入的了解JDK三.类间关系继承.委托.依赖.聚合.组合?四.介绍方式(1)作用:

PHP设计模式-观察者

PHP设计模式-观察者 一个对象状态发生改变后,会影响到其他几个对象的改变,这时候可以用观察者模式.一个对象通过添加一个attach方法允许观察者注册自己,使本身变得可观察.当被观察的对象更改时,它会将消息发送到已注册的观察者.观察者使用该信息执行的操作与被观察的对象无关.观察者模式是一种事件系统,意味着这一模式允许某些类通过观察被观察类的状态变化,做出相应的动作. 观察者模式UML图 php5中提供了观察者observer与被观察者subject接口 interface SplSubject

单例模式的几种实现--《java开发技术-在架构中体验设计模式和算法之美》

package com.doctor.java.design_pattern; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /**  * 单例模式的几种实现--<java开发技术-在架构中体验设计模式和算法之美>  *   * @author doctor  *  * @time 2015年4月24日 下午11:11:03  */ public class SingletonPattern { /**  * @param a

设计模式总结(《Head First设计模式》学习总结)

写在前面: 学习过程中不仅要熟练掌握技能,理论的消化吸收也必不可少.虽然个人更倾向于学习技术类的东西(短时间的精力投入很快就能看到成效...),但看了很多前辈的经验总结后才知道理论性的东西是绝对不能忽视的,毕竟理论对实践有着重要的指导意义.而了解“设计”相关的东西,会对“实现”产生潜移默化的影响,虽然不能在短时间内看到让人欣喜的变化,但可能有一天回过头来一想“哦~,原来我这个不错的小习惯是当年在那本书上学到的啊” 一.什么是设计模式? 绕了一圈之后让我们又回到这个话题吧(看书之前问自己一遍,看完

菜鸟看设计模式系列笔记之开篇:设计模式的原则及概论

模式是在某一个背景下的某一个问题的解决方案. 设计模式在很大程度上是为了解决软件的可复用性,而根据大量工程实践总结出来的软件体系结构,隐含包括了软件工程的面向对象思想:封装.继承.多态. 为什么需要设计模式:设计模式(Design Pattern )是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结, 使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码的可靠性. 设计模式一般有如下几个基本要素:模式名称.问题.目的.解决方案.效果.实例代码和相关的设计模式,关键因素包

设计模式第9篇:外观设计模式

一.外观设计模式所解决的问题 外观设计模式为子系统中的一组接口提供统一的接口,这种统一的接口屏蔽了直接调用子系统时的逻辑关系,使得调用子系统时更容易. 二.外观设计模式用例 假如一个应用中有两个接口MysqlHelper.class和OracleHelper.class,两个接口功能分别是连接mysql和oracle数据库,然后生成HTML报表或者PDF报表,代码说明如下: MysqlHelper.class和OracleHelper.class import java.sql.Connecti

C#设计模式(0):C#的23种设计模式概括

创建型:         1. 单件模式(Singleton Pattern)         2. 抽象工厂(Abstract Factory)         3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method)         5. 原型模式(Prototype) 结构型:         6. 适配器模式(Adapter Pattern)         7. 桥接模式(Bridge Pattern)         8. 装饰模式(Decorator

C#中的异步调用及异步设计模式(二)——基于 IAsyncResult 的异步设计模式

三.基于 IAsyncResult 的异步设计模式(设计层面) IAsyncResult 异步设计模式通过名为 BeginOperationName 和 EndOperationName 的两个方法来实现原同步方法的异步调用,如 FileStream 类提供了 BeginRead 和 EndRead 方法来从文件异步读取字节,它们是 Read 方法的异步版本 Begin 方法包含同步方法签名中的任何参数,此外还包含另外两个参数:一个AsyncCallback 委托和一个用户定义的状态对象.委托用

圣思园java se培训总结(78-)(swing的设计模式,观察者设计模式)

BorderLayout分东西南北中,默认是Frame的布局 FlowLayout是Panel的默认布局 GridLayout是网格布局!实例化一个网格布局对象时可以指定网格数量 panel必须添加到某个容器中才能显示! 事件是描述发生了什么的对象,这些对象是AWT提供好的,例如左键击单击会产生一个ActionEvent对象 事件源是发生这个事件的某个组件,例如单击某个按钮,这个按钮就是事件源 事件处理器 就是一个接收事件,处理事件的方法,用户自己写的! 单击一个按钮就会产生一个事件 (Acti