白白白

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

目标对象(Subject)

 

观察者对象(Observer)

 

将观察者对象注册到目标对象上,当目标对象的状态发生改变时推送给观察者(推/拉模型)

以天气预报为例:

/**目标对象*/
public
class WeatherSubject { private String weatherContent; private List<WeatherObserver> list = new ArrayList<WeatherObserver>(); public void addObserver(WeatherObserver observer) { this.list.add(observer); } public void setWeatherContent(String weatherContent) { this.weatherContent = weatherContent; for(WeatherObserver observer : list) {       // observer.update(this); 拉模型
      // observer.update(weatherContent);推模型 } }
public String getWeatherContent() { return weatherContent; } }

 

/**观察者对象*/
public
class WeatherObserver { private String observerName; public WeatherObserver(String observerName) { this.observerName = observerName; } public void update(WeatherSubject subject) { System.out.println(this.observerName +"收到的天气是:"+subject.getWeatherContent()); } }
public class Main {
    public static void main(String[] args) {
        WeatherObserver girl = new WeatherObserver("女朋友");
        
        WeatherObserver monther = new WeatherObserver("monther");
        
        WeatherSubject subject= new WeatherSubject();
        subject.addObserver(girl);
        subject.addObserver(monther);
        
        subject.setWeatherContent("小雨");
    }
}

 

用jdk中提供的工具实现

/**
 * 目标对象 ,将观察者注册到目标对象上,当目标对象的状态发生变化时,通知到每个观察者 
 */
public class WeatherSubject extends Observable {
    
    private String weatherContent;//需要通知的内容

    public String getWeatherContent() {
        return weatherContent;
    }

    public void setWeatherContent(String weatherContent) {
        this.weatherContent = weatherContent;
        
        //设置变更内容时 
        setChanged();
        
        //推模型
        notifyObservers(weatherContent);
        
        //拉模型
        //notifyObservers();
    }
}
//观察者
public class WeatherObserver implements Observer {

    private String observerName;
    
    public WeatherObserver(String observerName) {
        this.observerName = observerName;
    }
    //目标对象通知过来的更新 
    @Override
    public void update(Observable o, Object arg) {
        System.out.println(observerName+":收到的天气预报是:"+arg);
        
    }
}
public class Client {
    public static void main(String[] args) {
        Observer monther = new WeatherObserver("老妈");
        
        Observer girlFriend = new WeatherObserver("女朋友");
        
        WeatherSubject observable = new WeatherSubject();//目标对象 即可以被观察的对象
        
        observable.addObserver(monther);
        observable.addObserver(girlFriend);
        
        observable.setWeatherContent("下雨天");
    }
}

 

posted on 2017-05-07 22:36  道至简  阅读(126)  评论(0)    收藏  举报