Observer 模式

Observer 模式 第 2 页(共3 页)


Observer 是一个很常见的模式。在您用“模型/视图/控制器(Model/View/Controller)”体系结构实现应用程序时,通常会使用这一模式。该设计的“模型/视图”部分是为了去除数据的表示与数据本身的耦合性。

例如,设想这种情况:数据保存在数据库中,可以以多种格式(表格或图形)显示该数据。Observer 模式建议显示类向负责维护数据的类注册它们自身,这样在数据发生更改时可以通知显示类,从而它们可以更新它们的显示。

Java API 在它的 AWT/Swing 类的事件模型中使用该模式。它也提供了直接支持,这样出于其它目的时也能实现该模式。

Java API 提供了 Observable 类,它可以由要观察的对象进行子类化。Observable 提供了以下方法:

  • Observable 对象调用 addObserver(Observer o) 来注册自己。

  • setChanged()Observable 对象标记为已更改。

  • hasChanged() 测试 Observable 对象是否已更改。

  • 根据 hasChanged(),如果 Observable 对象已更改,notifyObservers() 通知所有观察类。

与此相应,还提供了一个 Observer 接口,它包含一个由 Observable 对象在其发生更改时调用的方法(当然,是在 Observer 已向 Observable 类注册了它自己的前提下):


public void update(Observable o, Object arg)

下面示例演示了如何使用 Observer 模式来通知诸如温度等传感器的显示类已检测到变化:


import java.util.*;
class Sensor extends Observable {
private int temp = 68;
  void takeReading()
  {
   double d; 
     d =Math.random();
     if(d>0.75)
     {
       temp++;
       setChanged();
     }
     else if (d<0.25)
     {
       temp--;
       setChanged();
     }
     System.out.print("[Temp: " + temp + "]");
  }
  public int getReading()
  {
    return temp;
  }
}
public class Display implements Observer {
  public void update(Observable o, Object arg)
  {
     System.out.print("New Temp: " +  ((Sensor) o).getReading());
  }
  public static void main(String []ac)
  { 
     Sensor sensor = new Sensor();
     Display display = new Display();
     // register observer with observable class
     sensor.addObserver(display);
     // Simulate measuring temp over time
     for(int i=0; i < 20; i++)
     {
        sensor.takeReading();
        sensor.notifyObservers();
        System.out.println();
     }
  }  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值