java观察者模式

java中,观察者模式主是由Observer接口和Observable类完成。其中,观察对象继承Observable类,而观察者实现Observer接口。

java.util下的public interface Observer

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

方法摘要
 voidupdate(Observable o, Object arg)
          只要改变了 observable 对象就调用此方法。

java.util.Observable 类

public class Observable extends Object此类表示模型视图范例中的 observable 对象,或者说“数据”。可将其子类化,表示应用程序想要观察的对象。 
一个 observable 对象可以有一个或多个观察者。观察者可以是实现了 Observer 接口的任意对象。一个 observable 实例改变后,调用 Observable 的 notifyObservers 方法的应用程序会通过调用观察者的 update 方法来通知观察者该实例发生了改变。 
未指定发送通知的顺序。Observable 类中所提供的默认实现将按照其注册的重要性顺序来通知 Observers,但是子类可能改变此顺序,从而使用非固定顺序在单独的线程上发送通知,或者也可能保证其子类遵从其所选择的顺序。 
注意,此通知机制与线程无关,并且与 Object 类的 wait 和 notify 机制完全独立。 
新创建一个 observable 对象时,其观察者集是空的。当且仅当 equals 方法为两个观察者返回 true 时,才认为它们是相同的。
构造方法摘要
Observable()
          构造一个带有零个观察者的 Observable。
  

方法摘要
 voidaddObserver(Observer o)
          如果观察者与集合中已有的观察者不同,则向对象的观察者集中添加此观察者。
protected  voidclearChanged()
          指示对象不再改变,或者它已对其所有的观察者通知了最近的改变,所以hasChanged方法将返回false。
 intcountObservers()
          返回Observable对象的观察者数目。
 voiddeleteObserver(Observer o)
          从对象的观察者集合中删除某个观察者。
 voiddeleteObservers()
          清除观察者列表,使此对象不再有任何观察者。
 booleanhasChanged()
          测试对象是否改变。
 voidnotifyObservers()
          如果hasChanged方法指示对象已改变,则通知其所有观察者,并调用clearChanged方法来指示此对象不再改变。
 voidnotifyObservers(Object arg)
          如果hasChanged方法指示对象已改变,则通知其所有观察者,并调用clearChanged方法来指示此对象不再改变。
protected  voidsetChanged()
          标记此Observable对象为已改变的对象;现在hasChanged方法将返回true。

示例代码:

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

 
class House extends Observable{							//观察对象
	private float price;
	public House(float price){
		this.price=price;
	}
	
	public float getPrice(){
		return price;
	}
	
	public void setPrice(float price){
		super.setChanged();								//设置变化点
		super.notifyObservers(price);					//通知所有观察者价格改变
		this.price=price;
	}
	
	public String toString(){
		return "房子的价格为:"+this.price;
	}
}

class HousePriceObserver implements Observer{
	private String name;
	public HousePriceObserver(String name){
		this.name=name;
	}
	
	public void update(Observable obj,Object arg){		
		if(arg instanceof Float){
			System.out.print(this.name+"观察到价格更改为:");
			System.out.println(((Float)arg).floatValue());
		}
	}
}

public class Text{
    public static void main(String[] args){  
        House h=new House(100000);
        HousePriceObserver hpo1=new HousePriceObserver("购房者A");
        HousePriceObserver hpo2=new HousePriceObserver("购房者B");
        HousePriceObserver hpo3=new HousePriceObserver("购房者C");
        //加入观察者
        h.addObserver(hpo1);
        h.addObserver(hpo2);
        h.addObserver(hpo3);
        System.out.println(h);
        h.setPrice(66666);						//修改房子价格
        System.out.println(h);
    }  
}  



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值