Java 中的观察者模式

来源:互联网 发布:上海 心理咨询 知乎 编辑:程序博客网 时间:2024/03/29 16:36

1。 观察者模式非常常见:

       比如你在qq上更新了文章,然后你的所有的好友都会被告知,这就是一种观察者模式

      此外,很多的图形界面都用到了观察者模式,例如swing ,当你点击某个按钮,其监听器就会执行操作,这也是一种观察者模式。

 

2 。 Java 实现观察者模式:

      其实最好是自己写一个观察者模式,使用Java中的api 会给可扩展行带来困难,但是Java实现会非常简单,易用可以满足大部分需求

      1)类 Observable:

           表示应用程序想要观察的对象,一个 observable 对象可以有一个或多个观察者。观察者可以是实现了 Observer 接口的任意对

           象。一个 observable 实例改变后,调用 ObservablenotifyObservers 方法的应用程序会通过调用观察者的 update

       方  法  来通知观察者该实例发生了改变。

 

      2)public interface Observer

       一个可在观察者要得到 observable 对象更改通知时可实现 Observer 接口的类。,定义一个观察者需要实现此接口

 

 

3    原理: 被观察者中某一函数会引起变化,并且希望将此变化通知观察者,可以先调用setChange()方法,表示状态已经改变,然后调

       用  notifyObservers方法通知观察者

 

    观察者中要有一个observable实例,并向此实例注册,将自己注册为此实例的观察者:

 

 

4。一个例子

 

public class FileOpen {
 public static void main(String[] args)
 {
  System.out.print("11");
  Subject sub=new Subject();
  Viewer viewer=new Viewer(sub);
  sub.setData(12);
  
  sub.setData(22);
  
 }

}

 

public class Subject extends Observable {
 
 private int aa;
 public Subject()
 {
  aa=0;
 }
 
 public void setData(int aa)
 {
  this.aa=aa;
  setChanged();//////////////////////////////////////必须写上表示状态改变
  //notifyObservers();
  
  notifyObservers(aa);////////////////////////////必须写上通知所有的观察者
 
 }

}

 

 

/**
 *
 * @author fanhengguang
 * 观察者,当主题
 *
 */
public class Viewer implements Observer {
 
 private Observable obs;
 public Viewer(Observable obs)        
 {
  this. obs=obs;
  obs.addObserver(this);         //将此对象登记为观察者
 }

 @Override
 public void update(Observable o, Object arg) {         //实现接口中的方法
  // TODO Auto-generated method stub
  System.out.println("改变了");
  System.out.println("此时的aa变为"+(Integer)arg);  //注意此arg 为notifyObservers()传递过来的参数
  
 }

}