设计模式--观察者与多主题

观察者与多主题:一个观察者可以依赖于多个主题,当所依赖的任何主题数据发生变化时,该观察者都能得到通知。处理多主题采用的是拉数据方式。

 

例子:李先生想了解每天的天气预报信息和每日的旅游信息。

 

/**
 * 
 */
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("暂无旅游信息。");
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值