Java对观察者模式的支持

ObserverDemo.java

/*
 * 程序功能:演示Java提供的观察者模式的实现方法。
 * 在Java中通过Observable类和Observer接口实现了观察者模式。
 * 一个Observer对象监视着一个Observable对象的变化,当Observable对象发生变化时,Observer得到通知,就可以进行相应的工作。例如在文档/视图结构中,文档被修改了,视图就会得到通知。
 * java.util.Observable中有两个方法对Observer特别重要:
 * 1、setChanged()方法:用来设置一个内部标志位注明数据发生了变化;
 * 2、notifyObservers()方法:调用一个列表中所有的Observer的update()方法,通知它们数据发生了变化。
 * Observer通过Observable的addObserver()方法把自己添加到这个列表中。这个列表虽然由Observable拥有,但Observable并不知道到底有哪些Observer正在观察等待通知。Observable只提供一个方法让Observer能把自己添加进列表,并保证会去通知Observer发生了变化。通过这种机制,可以有任意多个Observer对Observable进行观察,而不影响Observable的实现。

 */
package com.lwj.demo;

public class ObserverDemo {
 public static void main(String[] args) {
  SimpleObservable person=new SimpleObservable("陆武军",33);
  System.out.println("————————在没有添加观察者之前————————");
  System.out.println(person);
  
  new SimpleObserver(person);//建立并添加观察者
  
  System.out.println("————————在有了观察者之后————————");
  person.setName("陆武军");//这里没有改变,将不会调用update()方法。
  person.setName("王换兵");//这里改变了名字(name),将会调用update()方法。
 }

}

SimpleObservable.java

 

package com.lwj.demo;

import java.util.Observable;

//这是被观察者,继承了Observable类,注意在改变了被观察者的数据时,如何操作?
public class SimpleObservable extends Observable {
 private String name;
 private int age;
 
 public SimpleObservable(String name, int age) {
  super();
  this.name = name;
  this.age = age;
 }
 
 public String getName() {
  return name;
 }
 public void setName(String name) {
  if(!name.equals(this.name)){
   this.name = name;
   super.setChanged();//只有在setChanged()被调用后,notifyObservers()才会去调用update(),否则什么都不干。
  }
  super.notifyObservers();
 }
 public int getAge() {
  return age;
 }
 public void setAge(int age) {
  if(this.age!=age){
   this.age=age;
   super.setChanged();
  } 
  super.notifyObservers();
 }

 @Override
 public String toString() {
  return "SimpleObservable [name=" + this.name + ", age=" + this.age + "]";
 }
}

SimpleObserver.java

 

package com.lwj.demo;

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

//实现观察者
public class SimpleObserver implements Observer {

 public SimpleObserver(Observable o){
  o.addObserver(this);//向被观察者注册自己
 }
 
 //update()方法由Observer的notifyObservers()方法调用执行
 public void update(Observable arg0, Object arg1) {
  System.out.println("SimpleObservable对象已改变:"+arg0);
 }
}

 

运行结果:

————————在没有添加观察者之前————————
SimpleObservable [name=陆武军, age=33]
————————在有了观察者之后————————
SimpleObservable对象已改变:SimpleObservable [name=王换兵, age=33]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值