java中的Observable与Observer,观察者模式

观察者模式是一种设计模式,java对其进行封装来帮助开发者快速实现需要观察者模式的应用。具体来讲,在java中实现观察者模式需要java.util.Observerjava.util.Observable,要点如下:

  1. Observable是一个类,Observer是一个接口;
  2. Observable是被观察的对象,Observer是观察者,负责观察Observable
  3. Observable中需要保存一个Observer的列表(list);
  4. Observable对象被更新时,它会调用所有Observer中的update()方法,来表现数据更新的影响。
示例代码
import java.util.Observable;
import java.util.Observer;

class MessageBoard extends Observable{
    public void changeMessage(String message) 
    {
        setChanged();
        notifyObservers(message);
    }
}

class Student implements Observer {
    @Override
    public void update(Observable o, Object arg) 
    {
        System.out.println("Message board changed: " + arg);
    }
}

public class MessageBoardTest {
    public static void main(String[] args) {
        MessageBoard board = new MessageBoard();
        Student bob = new Student();
        Student joe = new Student();
        board.addObserver(bob);
        board.addObserver(joe);
        board.changeMessage("More Homework!");
    }
}
代码解析

java的官方文档中,对java.util.Observable做了一些说明,总结如下:

  1. Observable中会保存所有对其进行观察的Observer引用。如果有其他Observer想观察Observable,可以通过Observable中的addObserver(Observer o)进行注册,通过deleteObserver(Observer o)进行注销。
  2. Observable会维持一个内部状态,用来区分自上次通知过所有Observer后,数据是否产生了新的更新。这种设计非常有用,例如数据可能产生了多次更新,但是Observable只想把符合特定条件的数据通知给Observer。这一机制通过setChanged()实现,Observable调用该函数后,相应的更新才会通知给Observer。
  3. Observable通过调用notifyObservers()来将数据更新通知给其保存的所有Observer。在给Observer发送通知之前,notifyObservers()会检查数据是否发生了改变(即是否调用了setChanged())。如果数据发生了改变,Observer中的update()函数会被调用。
  4. notifyObservers()有两种重载的形式,分别是notifyObservers()notifyObservers(Object arg)。如果Observable在给Observer发送通知时想传递一些数据,需要调用notifyObservers(Object arg),这样Observer中的update(Observable o, Object arg)会被调用。该函数告诉Observer是哪一个Observable产生了数据更新(一个Observer可能同时观察多个Observable),同时Object arg参数也可以携带一些需要传递的数据。如果Observable调用无参版本的notifyObservers(),等同于调用notifyObservers(null)
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值