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

本文详细解释了观察者模式的概念及其在软件设计中的应用,通过具体实例展示了如何实现主题、观察者和显示元素之间的交互。重点介绍了如何通过主题对象通知观察者其状态变化,以及观察者如何响应这些变化进行相应的数据更新和展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单理解观察者模式
/**
 * 主题(被观察者信息)
 */
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);
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值