您的位置:首页 > 其它

观察者模式

2014-01-26 10:07 162 查看
一、定义

  对象之间定义一对多的依赖,当一个对象状态改变,依赖它的对象都会收到通知并作出相应的更新。

二、应用场景

  典型的就是杂志的订阅,rss订阅。我们订阅的一方就形成了对杂志社的依赖,只要杂志社有更新,而我们就对得到相应的通知

三、涉及的概念

  主题Subject(杂志社)

  观察者Observer(我们订阅的一方)

四、接口的定义

  对于杂志社(Subject)而言:

  1、可以添加一个订阅的人(Observer);registerObserver(Observer observer);

  2、如果不想订阅了,那杂志社可以吧相应订阅的人从名单上移除,那以后有新的杂志出来,不会再发送给那个人了;removeObserver(Observer observer)

  3、有新的杂志出来,那就要通知每个订阅的人;notifyObservers();

  对应的java类如下

/**
* @ClassName   类  名   称:    Subject.java
* @Description 功能描述:    主题
* @author      创  建   者:    zhengQun
* @date        创建日期:    2013-11-21下午2:16:09
*/
public interface Subject {
public void registerObserver(Observer observer);
public void removeObserver(Observer observer);
public void notifyObservers();
}


  对于我们订阅的一方(观察者):对于杂志的到来,我们可能会进行阅读,也有可能做收藏用。。。总的来说就是我们如何来应对主题的更新。对应的java类如下:

/**
* @ClassName   类  名   称:    Observer.java
* @Description 功能描述:
* @author      创  建   者:    zhengQun
* @date        创建日期:    2013-11-21下午2:27:30
*/
public interface Observer {
public void update(float temperature,float humidity,float pressure);
}


五、具体的应用:

如果气象站温度、湿度、压力改变了,需要在对应的布告板上显示出来

/**
* @ClassName   类  名   称:    WeatherData.java
* @Description 功能描述:
* @author      创  建   者:    zhengQun
* @date        创建日期:    2013-11-21下午2:29:12
*/
public class WeatherData implements Subject{
private List<Observer> observerList;
private float temperature;
private float humidity;
private float pressure;

public WeatherData() {
observerList = new ArrayList<Observer>();
}

public WeatherData(List<Observer> observerList) {
this.observerList = observerList;
}

public void registerObserver(Observer observer) {
observerList.add(observer);
}

public void removeObserver(Observer observer) {
if(observerList.indexOf(observer) != -1){
observerList.remove(observer);
}
}

public void notifyObservers() {
for (Observer o : observerList) {
o.update(temperature, humidity, pressure);
}
}

public void mesurementsChanged(){
notifyObservers();
}

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

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;
}
}


布告板:

/**
* @ClassName   类  名   称:    CurrentConditionDisplay.java
* @Description 功能描述:
* @author      创  建   者:    zhengQun
* @date        创建日期:    2013-11-21下午2:51:46
*/
public class CurrentConditionDisplay implements Observer,DisplayBehavior{
private float temperature;
private float humidity;

private Subject weatherData;

public CurrentConditionDisplay() {
}

public CurrentConditionDisplay(Subject weatherData) {
this.weatherData = weatherData;
weatherData.registerObserver(this);
}

public void display() {
System.out.println("当前的状况:" + temperature + "℃," + humidity + "%湿度");
}

public void update(float temperature, float humidity, float pressure) {
this.temperature = temperature;
this.humidity = humidity;
display();
}

}


测试类:

/**
* @ClassName   类  名   称:    Test.java
* @Description 功能描述:
* @author      创  建   者:    zhengQun
* @date        创建日期:    2013-11-21下午3:06:18
*/
public class Test {
public static void main(String[] args) {
WeatherData weatherData = new WeatherData();
CurrentConditionDisplay display = new CurrentConditionDisplay(weatherData);

weatherData.setMesurements(12, 60, 14);
}
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: