观察者模式定义了对象间的一对多依赖关系,让一个或多个观察者(Observer)观察一个主体对象(Observable),当主体对象的状态发生变化时,系统能通知所有的依赖此对象的观察者对象,从而使观察者对象自动更新。
观察者模式通常包含4个角色。
1.被观察对象的抽象基类。它通常包含多个观察者对象的引用,java提供了java.util.Observable基类来代表被观察者的抽象基类。
2.观察者接口。该接口通常包含一个抽象方法update(),是所有观察者应该实现的一个接口,java提供了java.util.Observer接口来代表观察者接口。
3.被观察者实现类:该类继承Observable。
4.观察者实现类:实现Observer接口,实现update抽象方法。
例: 观察者接口:
public Interface Observer{
void update(Observable o,Object arg);
}
被观察者类:
public class Observable{
private List<Observer> observers= new ArrayList<Observer>();
public void registObserver(Observer o) {
observers.add(o);
}
public void removeObserver(Observer o) {
observers.remove(o);
}
public void notifyObservers(Object value) {
for(Iterator it = observers.iterator();it.hasNext();){
Observer o = (Observer)it.next();
o.update(this,value);
}
}
}
下面定义一个具体被观察者
import java.util.Observable;
public class Product extends Observable
{
private String name;
private double price;
public Product(String name, double price)
{
this.name = name;
this.price = price;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
this.notifyObservers(name);
}
public double getPrice()
{
return price;
}
public void setPrice(double price)
{
this.price = price;
this.notifyObservers(price);
}
}
再定义两个具体观察者
public class NameObserver implements Observer
{
@Override
public void update(Observable o, Object arg)
{
System.out.println("物品名称"+o+"已经改变为:"+arg);
}
}
public class PriceObserver implements Observer
{
@Override
public void update(Observable o, Object arg)
{
System.out.println("物品价格"+o+"已经改变为:"+arg);
}
}
java事件机制就是利用观察者模式实现,被观察者当做事件源处理,观察者就是具体的事件接口