观察者模式

观察者模式的组成

  抽象主题角色:把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。

  抽象观察者角色:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。

  具体主题角色:在具体主题内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个子类实现。

  具体观察者角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。通常用一个子类实现。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用。

  • java.util.EventListener
  • javax.servlet.http.HttpSessionBindingListener
  • javax.servlet.http.HttpSessionAttributeListener 
  • Web开发中监听Session事件采用的是观察者模式
  • JDK 提供了  java.util.Observable,  java.util.Observer类

如果要想实现观察者模式,则必须依靠java.util包中提供的Observable类和Observer接口。

import java.util.* ; 
class House extends Observable{ // 表示房子可以被观察 
    private float price ;// 价钱 
    public House(float price){ 
        this.price = price ; 
    } 
    public float getPrice(){ 
        return this.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 o,Object arg){ 
        if(arg instanceof Float){ 
            System.out.print(this.name + "观察到价格更改为:") ; 
            System.out.println(((Float)arg).floatValue()) ; 
        } 
    } 
}; 
public class ObserDemo01{ 
    public static void main(String args[]){ 
        House h = new House(1000000) ; 
        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(666666) ;    // 修改房子价格 
        System.out.println(h) ; // 输出房子价格 
    } 
};

运行结果:

房子价格为:1000000.0

购房者C观察到价格更改为:666666.0

购房者B观察到价格更改为:666666.0

购房者A观察到价格更改为:666666.0

房子价格为:666666.0

原文地址:https://www.cnblogs.com/zjm-1/p/9059708.html