一、java自带的观察者模式

Observer对象是观察者,Observable对象是被观察者。

官网api文档:http://docs.oracle.com/javase/7/docs/api/

1. 实现观察者模式

实现观察者模式非常简单,

[1]创建被观察者类,它继承自java.util.Observable类;

[2]创建观察者类,它实现java.util.Observer接口;

  • 对于被观察者类:

添加它的观察者:

void addObserver(Observer o)

addObserver()方法把观察者对象添加到观察者对象列表中

当被观察者中的事件发生变化时,执行

setChanged();

notifyObservers();

setChange()方法用来设置一个内部标志位注明数据发生了变化;notifyObservers()方法会去调用观察者对象列表中所有的Observer的update()方法,通知它们数据发生了变化。

只有在setChange()被调用后,notifyObservers()才会去调用update()。

  • 对于观察者类,实现Observer接口的唯一方法update

void update(Observable o, Object arg)

形参Object arg,对应一个由notifyObservers(Object arg);传递来的参数,当执行的是notifyObservers();时,arg为null。

  • 实例:

被观察者:ServerManager

package com.test.observer;

import java.util.Observable;

public class ServerManager extends Observable {
     private int data = 0;
     public int getData(){         return data;    }
     public void setData(int i){
         if(this.data != i){ this.data = i;setChanged();}
         notifyObservers();  //只有在setChange()被调用后,notifyObservers()才会去调用update(),否则什么都不干。  } }
     }

}

观察者一:AObserver

import java.util.Observable;
import java.util.Observer;

public class AObserver implements Observer {

    public AObserver(ServerManager sm) {
        super();
        // TODO Auto-generated constructor stub
        sm.addObserver(this);  //注册加入观察者
    }

    @Override
    public void update(Observable arg0, Object arg1) {
        System.out.println("AObserver receive:Data has changed to "+((ServerManager) arg0).getData());

    }

}

观察者二:BObserver

import java.util.Observable;
import java.util.Observer;

public class BObserver implements Observer {

    public BObserver(ServerManager sm) {
        super();
        sm.addObserver(this);  //注册加入观察者
    }

    @Override
    public void update(Observable o, Object arg) {
        // TODO Auto-generated method stub
        System.out.println("BObserver receive:Data has changed to "+((ServerManager) o).getData());
    }

}

测试:

public class TestDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        ServerManager sm = new ServerManager();
        AObserver a    = new AObserver(sm);
        BObserver b = new BObserver(sm);
        sm.setData(5);
        sm.deleteObserver(a);  //注销观察者,以后被观察者有数据变化就不再通知这个已注销的观察者
        sm.setData(10);
    }

}

运行结果:

时间: 2024-12-28 06:04:18

一、java自带的观察者模式的相关文章

java parse 带英文单词的日期字符串 转 date (转化新浪微博api返回的时间)

拂晓风起 专注前端技术cocos2d.js.flash.html5,联系:[email protected].如果读者要找腾讯工作机会,请不吝推荐简历. 博客园 首页 新闻 新随笔 联系 管理 订阅 随笔- 227  文章- 0  评论- 336 java parse 带英文单词的日期字符串 转 date (转化新浪微博api返回的时间) 大家一般很少格式化或者parse带有Sun Nov等英文单词的字符串. 如果格式化英文月份的字符串,记得带上Locale.US参数,否则,JRE会按照当前地区

Java中带包(创建及引用)的类的编译与调试

Java中带包(创建及引用)的类的编译与调试 java源程序的编译大家都知道,也就是cmd中到源文件所在目录下javac **.java即可,当程序中有包声明还能简简单单的直接javac **.java吗?答案当然是no,下面举个简单的例子证明一下直接javac **.java会怎么样. 如下:F:\javaweb2班\20160531目录下有A.java文件,注意源文件中有包声明 package mypack; public class A { String name; int age; pu

【java】java自带的java.util.logging.Logger日志功能

偶然翻阅到一篇文章,注意到Java自带的Logger日志功能,特地来细细的看一看,记录一下. 1.Java自带的日志功能,默认的配置 ①Logger的默认配置,位置在JRE安装目录下lib中的logging.properties中 ②logging.properties日志文件内容如下: ############################################################ # Default Logging Configuration File # # You

Java自带优秀工具2

Jconsole 是原生java自带的系统monitor工具,可以连接本地也可以连接远端的java process,连接java process之后可以查看应用的CPU,内存,线程数,GC情况,可以帮忙查看系统是否有死锁的现象,还可以查看MBean export出来的系统接口和数据.不过我现在比较少用它了,因为有了jvisualvm. jvisualvm jvisualvm原本是要钱的工具,自从1.6整到jdk里面之后,幸福了我.有了jvisualvm,在图形界面条件允许的情况下,对系统性能调优

java两种序列化(hessian与java自带)性能实验分析报告

序列化的5w2h分析 what:序列化是一种将java对象流化的机制 how:将一个实现了Serializable接口的对象的状态写入byte[],传输到另外一个地方,将其读出进行反序列化得对象(含状态).状态就是类中的属性是含有值的. why:方便对象在网络间进行传播,并且可以随时把对象持久化到数据库.文件等系统里 when:对象需要远程过程调用,缓存到文件或DB中(hessian,rmi,ejb) where:发送接口处,写入文件的入口处 who:发送端序列化,接收端反序列化 how muc

Java基础---Java中带参数无返回值方法的使用(三十九)

Java 中带参无返回值方法的使用 有时方法的执行需要依赖于某些条件,换句话说,要想通过方法完成特定的功能,需要为其提供额外的信息才行.例如,现实生活中电饭锅可以实现"煮饭"的功能,但前提是我们必须提供食材,如果我们什么都不提供,那就真是的"巧妇难为无米之炊"了.我们可以通过在方法中加入参数列表接收外部传入的数据信息,参数可以是任意的基本类型数据或引用类型数据. 我们先来看一个带参数,但没有返回值的方法: 上面的代码定义了一个 show 方法,带有一个参数 name

Java基础---Java中带参数返回值方法的使用(四十)

Java 中带参带返回值方法的使用 如果方法既包含参数,又带有返回值,我们称为带参带返回值的方法. 例如:下面的代码,定义了一个 show 方法,带有一个参数 name ,方法执行后返回一个 String 类型的结果 调用带参带返回值的方法: 运行结果: 代码: import java.util.Arrays; public class HelloWorld {    public static void main(String[] args) {  HelloWorld hello = new

Spark的Straggler深入学习(1):如何在本地图形监控远程Spark的GC情况——使用java自带的jvisualvm

一.本文的目的 Straggler是目前研究的热点,Spark中也存在Straggler的问题.GC问题是总所周知的导致Straggler的重要因素之一,为了了解GC导致的Straggler问题,首先需要学习GC问题以及如何监控Spark的GC.GC问题的讨论比较多了,推荐一篇系列文章用于学习:成为Java的GC专家. 二.本文所需工具 本文所需工具很简单,基本不用下载.监控GC的前提是: 1.已经在集群上安装了Spark并可以正常提交作业: 2.本地装有jdk1.6以上版本. 本文实际使用的工

Java 自带性能监控工具:监视和管理控制台 jconsole 的使用

1. 前言 想验证你对 jvm 配的一些调优参数(比如 Xms.Xmx 等)有没有起作用吗? 想不想实时监控你自定义的线程池的在实际运行时的线程个数.有没有死锁? 应用出现 java.lang.OutOfMemoryError: Java heap space,你知道需要去调整 Xms.Xmx.想不想实时监控你的 Java 应用的堆内存使用情况,并根据峰值等数据设置最适合你的 Xms.Xmx 等参数? 应用出现 java.lang.OutOfMemoryError: PermGen space,