设计模式——观察者模式(Observer)

观察者模式Observer)是一种一对多的关系,即多个观察者共同与同一个被观察者之间的联系; 这种模式的好处在于解耦合。


1、模式中的角色对象

抽象主题(Subject类):抽象主题即被观察者类的接口,为具体主题提供抽象接口

具体主题(ConcreteSubject类):一个有具体实现的主题类(被观察者类)

抽象观察者(Observer类):观察者类的抽象接口

具体观察者(ConcreteObserver类):实现抽象观察者接口的具体观察者类

2、角色关系图


3、实例

描述:假设某气象站要将实时天气信息公布在显示屏幕上,即当气象数据发生变量便马上更新显示屏内容

a.Subject接口

public interface Subject {
	public abstract void registerObserver(Observer o);
	public abstract void removeObserver(Observer o);
	public abstract void notifyObservers();

}
b. ConcreteSubject类

import java.util.ArrayList;
import com.interfaces.Observer;
import com.interfaces.Subject;
public class WeatherData implements Subject {
	private ArrayList observers;
	private float temperature;
	private float humidity;
	private float pressure;
	public WeatherData() {
		observers=new ArrayList();
	}
	@Override
	public void registerObserver(Observer o) {
		// TODO Auto-generated method stub
		observers.add(o);
	}
	@Override
	public void removeObserver(Observer o) {
		// TODO Auto-generated method stub
		int i=observers.indexOf(o);
		if(i>=0){
			observers.remove(i);
		}
	}
	@Override
	public void notifyObservers() {
		// TODO Auto-generated method stub
		for(int i=0;i<observers.size();i++){
			Observer observer=(Observer)observers.get(i);
			observer.update(temperature, humidity, pressure);
		}
	}
	public void setMeasurements(float temperature,float humidity,float pressure){
		this.temperature=temperature;
		this.humidity=humidity;
		this.pressure=pressure;
		notifyObservers();
	}

}
c. Observer接口

public interface Observer {
	public abstract void update(float temperature,float humidity,float pressure);
}
d.ConcreteObserver类

import com.interfaces.DisplayElement;
import com.interfaces.Observer;
import com.interfaces.Subject;

public class CurrentConditionDisplay implements Observer {

	private float temperature;
	private float humidity;
	private float pressure;
	private Subject weatherData;
	
	public CurrentConditionDisplay(Subject weatherData) {
		this.weatherData=weatherData;
		weatherData.registerObserver(this);
		// TODO Auto-generated constructor stub
	}
	public void display() {
		// TODO Auto-generated method stub
		System.out.println("Current donditions: "+temperature+"F degrees and "
				+humidity+"% humidity"+" and pressure"+pressure);

	}
	@Override
	public void update(float temperature, float humidity, float pressure) {
		// TODO Auto-generated method stub
		this.temperature=temperature;
		this.humidity=humidity;
		this.pressure=pressure;
		display();
	}

}


后记:

积跬步  至千里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值