观察者与多主题:一个观察者可以依赖于多个主题,当所依赖的任何主题数据发生变化时,该观察者都能得到通知。处理多主题采用的是拉数据方式。
例子:李先生想了解每天的天气预报信息和每日的旅游信息。
/**
*
*/
package org.rico.pattern.demo.observer.observer3;
/**
* @author rico 2013-3-3
* 主题:定义具体主题需要实现的方法,如:添加、删除、通知观察者的方法。
*/
public interface Subject {
/**
* 新增观察者
* @param observer
*/
public void add(Observer observer);
/**
* 删除观察者
* @param observer
*/
public void delete(Observer observer);
/**
* 主题通知观察者更新数据
*/
public void notifyObserver();
}
/**
*
*/
package org.rico.pattern.demo.observer.observer3;
/**
* @author rico 2013-3-3
* 定义具体观察者用来更新数据的方法。
*/
public interface Observer {
/**
* 观察者接受主题数据变化的通知,然后更新自己的数据。
* @param msg
*/
public void update(Subject subject);
}
/**
*
*/
package org.rico.pattern.demo.observer.observer3.impl;
import java.util.ArrayList;
import java.util.List;
import org.rico.pattern.demo.observer.observer3.Observer;
import org.rico.pattern.demo.observer.observer3.Subject;
/**
* @author rico 2013-3-4
* 气象站(具体主题)
*/
public class Weather implements Subject {
private List<Observer> observers;
private String msg;
private int low;
private int high;
public Weather() {
observers = new ArrayList<Observer>();
}
/* (non-Javadoc)
* @see org.rico.pattern.demo.observer.observer3.Subject#add(org.rico.pattern.demo.observer.observer3.Observer)
*/
@Override
public void add(Observer observer) {
if(!observers.contains(observer)) {
observers.add(observer);
}
}
/* (non-Javadoc)
* @see org.rico.pattern.demo.observer.observer3.Subject#delete(org.rico.pattern.demo.observer.observer3.Observer)
*/
@Override
public void delete(Observer observer) {
if(observers.contains(observer)) {
observers.remove(observer);
}
}
/* (non-Javadoc)
* @see org.rico.pattern.demo.observer.observer3.Subject#notifyObserver()
*/
@Override
public void notifyObserver() {
for(Observer ob : observers) {
ob.update(this);
}
}
//更新天气信息
public void doForecast(String msg, int low, int high) {
this.setMsg(msg);
this.setLow(low);
this.setHigh(high);
this.notifyObserver();
}
public List<Observer> getObservers() {
return observers;
}
public void setObservers(List<Observer> observers) {
this.observers = observers;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public int getLow() {
return low;
}
public void setLow(int low) {
this.low = low;
}
public int getHigh() {
return high;
}
public void setHigh(int high) {
this.high = high;
}
}
/**
*
*/
package org.rico.pattern.demo.observer.observer3.impl;
import java.util.ArrayList;
import java.util.List;
import org.rico.pattern.demo.observer.observer3.Observer;
import org.rico.pattern.demo.observer.observer3.Subject;
/**
* @author rico 2013-3-4
* 旅行社(具体主题)
*/
public class TravelAgency implements Subject {
private List<Observer> observers;
private String msg;
public TravelAgency() {
observers = new ArrayList<Observer>();
}
/* (non-Javadoc)
* @see org.rico.pattern.demo.observer.observer3.Subject#add(org.rico.pattern.demo.observer.observer3.Observer)
*/
@Override
public void add(Observer observer) {
if(!observers.contains(observer)) {
observers.add(observer);
}
}
/* (non-Javadoc)
* @see org.rico.pattern.demo.observer.observer3.Subject#delete(org.rico.pattern.demo.observer.observer3.Observer)
*/
@Override
public void delete(Observer observer) {
if(observers.contains(observer)) {
observers.remove(observer);
}
}
/* (non-Javadoc)
* @see org.rico.pattern.demo.observer.observer3.Subject#notifyObserver()
*/
@Override
public void notifyObserver() {
for(Observer ob : observers) {
ob.update(this);
}
}
//更新旅游社信息
public void giveMsg(String msg) {
this.setMsg(msg);
this.notifyObserver();
}
public List<Observer> getObservers() {
return observers;
}
public void setObservers(List<Observer> observers) {
this.observers = observers;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
/**
*
*/
package org.rico.pattern.demo.observer.observer3.impl;
import org.rico.pattern.demo.observer.observer3.Observer;
import org.rico.pattern.demo.observer.observer3.Subject;
/**
* @author rico 2013-3-4
*
*/
public class Person implements Observer {
private Subject weatherSub;
private Subject travelSub;
public Person(Subject weatherSub, Subject travelSub) {
this.setWeatherSub(weatherSub);
this.setTravelSub(travelSub);
weatherSub.add(this);
travelSub.add(this);
}
/* (non-Javadoc)
* @see org.rico.pattern.demo.observer.observer3.Observer#update(org.rico.pattern.demo.observer.observer3.Subject)
*/
@Override
public void update(Subject subject) {
if(subject instanceof Weather) {
Weather weather = (Weather) subject;
System.out.println("天气信息:" + weather.getMsg() + "-最高温:" + weather.getHigh() + "-最低温:" + weather.getLow());
} else if(subject instanceof TravelAgency) {
TravelAgency travel = (TravelAgency) subject;
System.out.println("旅行社信息: " + travel.getMsg());
}
}
public Subject getWeatherSub() {
return weatherSub;
}
public void setWeatherSub(Subject weatherSub) {
this.weatherSub = weatherSub;
}
public Subject getTravelSub() {
return travelSub;
}
public void setTravelSub(Subject travelSub) {
this.travelSub = travelSub;
}
}
/**
*
*/
package org.rico.pattern.demo.observer.observer3;
import org.rico.pattern.demo.observer.observer3.impl.Person;
import org.rico.pattern.demo.observer.observer3.impl.TravelAgency;
import org.rico.pattern.demo.observer.observer3.impl.Weather;
/**
* @author rico 2013-3-4
*
*/
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
Weather weather = new Weather();
TravelAgency travel = new TravelAgency();
Observer observer = new Person(weather, travel);
weather.doForecast("阴天", 10, 20);
travel.giveMsg("暂无旅游信息。");
}
}