观察者模式定义了对象间的一对多依赖关系,让一个或多个观察者对象观察一个主题对象。当主题对象的状态发生变化时,系统能通知所有的依赖于此对象的观察者对象,从而使得观察者对象能够自动更新。


public interface Observer {
    void update(Observable o,Object arg);
}


public abstract class Observable {
    List<Observer> observers = new ArrayList<Observer> ();
   
    //定义一个方法,用于从该主题上注册观察者
    public void registObserver(Observer o){
        observers.add(o);
    }
   
    //定义一个方法,用于从该主题上删除观察者
    public void removeObserver(Observer o){
        observers.remove(o);
    }
   
    //通知该主题上注册的所有观察者
    public void notifyObserver(Object value){
        for(Iterator it = observers.iterator();
            it.hasNext();){
            Observer o= (Observer)it.next();
            o.update(this, value);
        }
    }
}


public class Product extends Observable {
    private String name;
   
    private Double price;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
        notifyObserver(name);
    }

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
        notifyObserver(price);
    }

    public Product() {
        super();
    }

    public Product(String name, Double price) {
        super();
        this.name = name;
        this.price = price;
    }
}


import javax.swing.JFrame;
import javax.swing.JLabel;


public class NameObserver implements Observer {

    public void update(Observable o, Object arg) {
        // TODO Auto-generated method stub
        if(arg instanceof String){
            String name = (String)arg;
            JFrame f = new JFrame();
            JLabel l = new JLabel("名称改变为:" + name);
            f.add(l);
            f.pack();
            f.setVisible(true);
            System.out.println("名称观察者:" + o + "物品名称已经改变为:" + name);
        }
    }



public class PriceObserver implements Observer {

    public void update(Observable o, Object arg) {
        // TODO Auto-generated method stub
        if(arg instanceof Double){
            System.out.println("价格观察者:" + o + "物品价格已经改变为:" + arg);
        }
    }


public class Test {

    public static void main(String[] args){
        Product p = new Product("电视机",176D);
        NameObserver no = new NameObserver();
        PriceObserver po = new PriceObserver();
        p.registObserver(no);
        p.registObserver(po);
        p.setName("书桌");
        p.setPrice(345D);
    }
}