简单理解观察者模式(Observer)

简单理解观察者模式
/**
 * 主题(被观察者信息)
 */
public interface Subject {

	/**
	 * 注册观察此对象
	 */
	boolean registerObserver(Observer observer);
	/**
	 * 删除此对象
	 */
	boolean removeObserver(Observer observer);
	/**
	 * 通知变化
	 * 当主题状态改变时, 这个方法会被调用,以通知所有的观察者。
	 */
	int notifyObservers();
}


/**
 * 观察者接口
 */
public interface Observer {

	/**
	 * 更新数据
	 * 所有的观察者都必须实现update()方法,以实现观察者接口。在这里,我们按照Mary和Sue的想法把观测值传入观察者中
	 * @return
	 */
	boolean update(double temp,double humidity,double pressure);
}

/**
 * 不同的显示
 */
public interface DisplayElement {
	void display();
}

/**
 * 主题对象类
 */
public class WeatherData implements Subject {

	private List<Observer> observers = new ArrayList<Observer>();
	private double temperature;
	private double humidity;
	private double pressure;
	
	public WeatherData() {
	}

	@Override
	public boolean registerObserver(Observer observer) {
		return observers.add(observer);
	}

	@Override
	public boolean removeObserver(Observer observer) {
		if(observers != null || observers.isEmpty()){
			throw new RuntimeException("注册列表为空");
		}
		return observers.remove(observer);
	}

	@Override
	public int notifyObservers() {
		if(observers == null || observers.isEmpty()){
			return 0;
		}
		int result = 0;
		for (int i = 0,size=observers.size(); i < size; i++) {
			Observer o = observers.get(i);
			o.update(temperature, humidity, pressure);
			result++;
		}
		return result;
	}
	
	/**
	 * 主题发生变化,通知观察者
	 */
	public void measurementsChanged() {
		notifyObservers();
	}
	
	/**
	 * 改变主题
	 */
	public void setMeasurements(double temperature, double humidity, double pressure) {
		this.temperature = temperature;
		this.humidity = humidity;
		this.pressure = pressure;
		measurementsChanged();
	}
}

/**
 * 观察者对象类
 */
public class CurrentConditionsDisplay implements Observer,DisplayElement {

	private double temperature;
    private double humidity;
    private Subject weatherData;
	
	public CurrentConditionsDisplay(Subject weatherData) {
		this.weatherData = weatherData;
		weatherData.registerObserver(this);
	}
	@Override
	public boolean update(double temp, double humidity, double pressure) {
		this.temperature = temp;
		this.humidity = humidity;
		display();
		return true;
	}

	@Override
	public void display() {
		 System.out.println("Current conditions: " + temperature 
		            + "F degrees and " + humidity + "% humidity");
	}

}

/**
 * 数据源
  */
public class WeatherStation {

	public static void main(String[] args) {
		WeatherData wd = new WeatherData();
		CurrentConditionsDisplay ccd = new CurrentConditionsDisplay(wd);
		wd.setMeasurements(80, 60, 30);
		wd.setMeasurements(81, 61, 31);
		wd.setMeasurements(82, 62, 32);
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值