观察者模式

观察者模式:可以帮助你的对象知悉状况,不会错过该对象感兴趣的事.对象甚至可以在运行时可决定是否被通知.

当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。

 Java对观察者模式的支持主要体现在Observable类和Observer接口。

 

应用:

1.当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。

 

2.当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。

class  Subject
{
    private boolean changed = false;
    private List obs;
    public Subject (){
        obs = new ArrayList();
    }
    public synchronized void addObsever(Observer o){
        if(o==null){
            throw new NullPointerException();
        }
        if(!obs.contains(o))
            obs.add(o);
    }

    public synchronized void removeObserver(Observer o ){
        obs.remove(o);
    }
    public void notifyObservers(){
        if(!changed) return ;
        for(Observer o : obs ){
            o.update();
        }
    }
    public void setChanged(){
        changed = true;
    }
}
interface Observer{
   public abstract void update(Observable o,Object arg );       
}

 

 

 

 1 package observerParrern;
 2 
 3 import java.util.Observable;
 4 import java.util.Observer;
 5 /**
 6  * 应用:房价改变时,人们可以自动知道改变后的房价
 7  * 观察者模式:
 8  *  主题 : 房价
 9  *  观察者: 想要买房者
10  * 
11  * */
12 public class ConcreteSubject extends Observable {
13     private int price;
14     public ConcreteSubject(int price) {
15         this.price = price;
16     }
17     public int getPrice() {
18         return price;
19     }
20     //房价改变时,观察者应该得到更新后的房价
21     public void setPrice(int price) {
22         this.price = price;
23         //1.设置changed = true;
24         //2.通知所有的观察者
25         setChanged();
26         notifyObservers(price);
27     }
28     
29 }
30 class  ConcreteObserver implements Observer{
31     private String name;
32     public ConcreteObserver(String name ) {
33         this.name = name;
34     }
35 
36     public void update(Observable o, Object arg) {
37         System.out.println(name+":房价改变了,现在是:"+arg+"元");
38     }
39 }

 

 

posted @ 2013-06-27 21:43  Simple++  阅读(249)  评论(0)    收藏  举报