您的位置:首页 > 其它

Observer Pattern(观察者模式)

2011-03-09 17:24 393 查看
观察者模式应用比较广泛,写一个简单的示例,扩展了一下Head First上面例子的应用范围,进一步降低Observer与Subject之间的耦合度。

简单例子,直接给代码:

package test;
public interface Subject {
public void registerObserver(Observer observer);
public void unRegisterObserver(Observer observer);
public void notifyAllObservers();
public void notifyObserver(Observer observer);
}

package test;
public interface Observer {
public void registerSubject(Subject subject);
public void unRegisterSubject(Subject subject);
public void update(Subject subject);
}

package test;
import java.util.ArrayList;
import java.util.List;
public class WeatherDataSubject implements Subject {

List<Observer> observers = new ArrayList<Observer>();
private float temperature;
private float humidity;
private float pressure;

public float getTemperature() {
return temperature;
}
public void setTemperature(float temperature) {
this.temperature = temperature;
}
public float getHumidity() {
return humidity;
}
public void setHumidity(float humidity) {
this.humidity = humidity;
}
public float getPressure() {
return pressure;
}
public void setPressure(float pressure) {
this.pressure = pressure;
}

@Override
public void registerObserver(Observer observer) {
// TODO Auto-generated method stub
if(!observers.contains(observer))
observers.add(observer);
}
@Override
public void unRegisterObserver(Observer observer) {
// TODO Auto-generated method stub
if(observers.contains(observer))
observers.remove(observer);
}
@Override
public void notifyAllObservers() {
// TODO Auto-generated method stub
for(Observer o:observers)
o.update(this);
}
@Override
public void notifyObserver(Observer observer) {
// TODO Auto-generated method stub
if(observers.contains(observer))
observer.update(this);
}

public void setWeatherDataParameters(float temperature,float humidity,float pressure)
{
this.setTemperature(temperature);
this.setHumidity(humidity);
this.setPressure(pressure);
this.notifyAllObservers();
}
}

package test;
public class DisplayPanel implements Observer {

private float temperature;
private float humidity;
private float pressure;

public float getTemperature() {
return temperature;
}
public void setTemperature(float temperature) {
this.temperature = temperature;
}
public float getHumidity() {
return humidity;
}
public void setHumidity(float humidity) {
this.humidity = humidity;
}
public float getPressure() {
return pressure;
}
public void setPressure(float pressure) {
this.pressure = pressure;
}
@Override
public void registerSubject(Subject subject) {
// TODO Auto-generated method stub
subject.registerObserver(this);
}
@Override
public void unRegisterSubject(Subject subject) {
// TODO Auto-generated method stub
subject.unRegisterObserver(this);
}
@Override
public void update(Subject subject) {
// TODO Auto-generated method stub
if(subject instanceof WeatherDataSubject)
{
WeatherDataSubject s = (WeatherDataSubject)subject;
this.setTemperature(s.getTemperature());
this.setHumidity(s.getHumidity());
this.setPressure(s.getPressure());
}

this.display();
}
public void display() {
System.out.println("Temperature:"+this.getTemperature());
System.out.println("Humidity:"+this.getHumidity());
System.out.println("Pressure:"+this.getPressure());
}
}

package test;
public class Driver {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
WeatherDataSubject subject1=new WeatherDataSubject();
WeatherDataSubject subject2=new WeatherDataSubject();

Observer panel1 = new DisplayPanel();
Observer panel2 = new DisplayPanel();
panel1.registerSubject(subject1);
panel1.registerSubject(subject2);
panel2.registerSubject(subject2);

subject1.setWeatherDataParameters(15.0f, 0.32f, 1076.23f);
subject2.setWeatherDataParameters(13.5f, 0.42f, 1087.11f);
System.out.println("Subject1:======================");
subject1.notifyAllObservers();
System.out.println("Subject2:======================");
subject2.notifyAllObservers();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: