Internet气象站例题:
提供温度、气压和湿度的接口
测量数据更新时需时时通知给第三方
需要设计开放型API,便于其他第三方公司也能接入气象站获取数据
观察者模式原理:
1、观察者模式就像定牛奶业务
1)奶站,Subject
2)用户,Observer
2、Subject:登记注册、移除和通知
3、Observer:接收输入
4、观察者模式: 对象之间多对一依赖的一种设计方案,被依赖的对象为Subject,依赖的对象为Observer,Subject通知Observer变化
用观察者模式设计的例题方案
1 两个接口
package com.sk.superInterface;
public interface Subject
{
public void registerObserver(Observer observer);
public void removeObserver(Observer observer);
public void notifyObservers();
}
package com.sk.superInterface;
public interface Observer
{
public void update(float temprature,float pressure,float humidity);
}
2. 继承接口
package com.sk.mode;
import java.util.ArrayList;
import com.sk.superInterface.Observer;
import com.sk.superInterface.Subject;
public class WeatherData implements Subject
{
private float m_temprature;
private float m_pressure;
private float m_humidity;
private ArrayList<Observer> m_observers;
public WeatherData()
{
m_observers=new ArrayList<Observer>();
}
public void setData(float m_temprature,float m_pressure,float m_humidity)
{
this.m_temprature=m_temprature;
this.m_pressure=m_pressure;
this.m_humidity=m_humidity;
dataChange();
}
//改变数据之后就要通知所有的观察者
private void dataChange()
{
notifyObservers();
}
@Override
public void registerObserver(Observer observer)
{
m_observers.add(observer);
}
@Override
public void removeObserver(Observer observer)
{
if(m_observers.contains(observer))
{
m_observers.remove(observer);
}
}
@Override
public void notifyObservers()
{
for (int i = 0,len=m_observers.size(); i < len; i++)
{
m_observers.get(i).update(getM_temprature(), getM_pressure(), getM_humidity());
}
}
public float getM_temprature()
{
return m_temprature;
}
public float getM_pressure()
{
return m_pressure;
}
public float getM_humidity()
{
return m_humidity;
}
public ArrayList<Observer> getM_observers()
{
return m_observers;
}
}
package com.sk.mode;
import java.awt.DisplayMode;
import com.sk.superInterface.Observer;
public class CurrentConditions implements Observer
{
private float m_temprature;
private float m_pressure;
private float m_humidity;
@Override
public void update(float temprature, float pressure, float humidity)
{
this.m_humidity=humidity;
this.m_pressure=pressure;
this.m_temprature=temprature;
display();
}
public void display()
{
System.out.println("***Today's weather***");
System.out.println("***temprature:***"+m_temprature);
System.out.println("***pressure***"+m_pressure);
System.out.println("***humidity***"+m_humidity);
}
}
3. 入口
package com.sk.main;
import com.sk.mode.CurrentConditions;
import com.sk.mode.ForecastConditions;
import com.sk.mode.WeatherData;
public class InternetWeather
{
public static void main(String[] args)
{
CurrentConditions conditions=new CurrentConditions();
ForecastConditions forecastConditions=new ForecastConditions();
WeatherData weatherData=new WeatherData();
weatherData.registerObserver(conditions);
weatherData.registerObserver(forecastConditions);
weatherData.setData(35, 150, 40);
weatherData.removeObserver(conditions);
weatherData.setData(45, 160, 50);
}
}
Java内置观察者
1、Java内置的观察者
Observable
Observer
2、用Java内置观察者重新设计该项目
3、内置观察者的注意点
Observable是类而不是接口