观察者模式:在状态之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖他的对象会都收到通知,并改变状态。
代码实现:
1.采用自定义的observer和observable(subject)接口
(1)创建subject和observer两个接口,以及布告板接口
public interface Observer {
public void update(float temp, float humidity, float pressure);
}
public interface Subject {
public void registerObserver(Observer o);
public void removeObserver(Observer o);
public void notifityObservers();
}
public interface DisplayElements {
public void display();
}
(2)继承subject接口实现weatherData类
import java.util.ArrayList;
public class WeatherData implements Subject{
private ArrayList observers;
private float temp;
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(o);
}
}
@Override
public void notifityObservers() {
// TODO Auto-generated method stub
for (int i = 0; i < observers.size(); i++) {
Observer observer = (Observer) observers.get(i);
observer.update(temp, humidity, pressure);
}
}
public void meassurementChanged() {
notifityObservers();
}
public void setMeassurement(float temp, float humidity, float pressure) {
this.temp = temp;
this.humidity = humidity;
this.pressure = pressure;
meassurementChanged();
}
}
(3)继承observer以及DisplayElements 实现布告板类
public class CurrentConditionDisplay implements DisplayElements, Observer{
private float temp;
private float humidity;
private Subject weatherData;
public CurrentConditionDisplay(Subject weatherData){
this.weatherData = weatherData;
weatherData.registerObserver(this);
}
@Override
public void update(float temp, float humidity, float pressure) {
// TODO Auto-generated method stub
this.temp = temp;
this.humidity = humidity;
display();
}
@Override
public void display() {
// TODO Auto-generated method stub
System.out.println("Current condition:" + temp + "F degrees and " + humidity + "% humidity");
}
}
(4)测试代码
public class WeatherStation {
public static void main(String[] args){
WeatherData weatherData = new WeatherData();
CurrentConditionDisplay currrentDisplay = new CurrentConditionDisplay(weatherData);
weatherData.setMeassurement(80, 65, 30.4f);
weatherData.setMeassurement(82, 70, 29.2f);
weatherData.setMeassurement(78, 90, 29.2f);
}
}
2.采用java本身的observer和observable接口
(1)继承java的observable接口实现WeatherData类
import java.util.ArrayList;
import java.util.Observer;
import java.util.Observable;
public class WeatherData extends Observable{
private float temp;
private float humidity;
private float pressure;
public WeatherData(){}
public void meassurementChanged() {
setChanged();
notifyObservers();
}
public void setMeassurement(float temp, float humidity, float pressure) {
this.temp = temp;
this.humidity = humidity;
this.pressure = pressure;
meassurementChanged();
}
public float getTemperature(){
return temp;
}
public float getHumidity(){
return humidity;
}
public float getPressure(){
return pressure;
}
}
(2)继承Observer接口实现CurrentConditionDisplay 类
import java.util.Observer;
import java.util.Observable;
import com.observerpattern.custom.DisplayElements;
public class CurrentConditionDisplay implements DisplayElements, Observer{
private Observable observable;
private float temp;
private float humidity;
public CurrentConditionDisplay(Observable observable){
this.observable = observable;
observable.addObserver(this);
}
@Override
public void display() {
// TODO Auto-generated method stub
System.out.println("Current condition:" + temp + "F degrees and " + humidity + "% humidity");
}
@Override
public void update(Observable o, Object arg) {
// TODO Auto-generated method stub
System.out.println("update weatherdata");
if(o instanceof WeatherData) {
WeatherData weatherData = (WeatherData)o;
this.temp = weatherData.getTemperature();
this.humidity = weatherData.getHumidity();
display();
}
}
}
(3)测试代码
public class WeatherStation {
public static void main(String[] args){
WeatherData weatherData = new WeatherData();
CurrentConditionDisplay currrentDisplay = new CurrentConditionDisplay(weatherData);
weatherData.setMeassurement(80, 65, 30.4f);
weatherData.setMeassurement(82, 70, 29.2f);
weatherData.setMeassurement(78, 90, 29.2f);
}
}