現有以下的場景需求: 有一個 氣象觀察者,能一次性記錄下 溫度,氣壓,溼度 這三個數據 而且將這三個數據 發佈到三個 的顯示屏幕上面 ,每個屏幕關注的點不同 java
好比 溫度這個顯示屏 只關注 溫度和溼度 溼度顯示屏只關注 溼度和睦壓 等ide
這個時候咱們能夠使用觀察者模式,氣象站的數據 就是這個 「一」 ,三個顯示屏上面的數據都是須要依賴它的,這就是 「多」!測試
實現代碼 以下 :this
先 定義 主題接口 和 觀察者接口 以及 表現接口spa
package com.observe.interfaceModel.www;接口
// 這裏定義的是觀察者模式的主題
public interface Subject {
public void registerObserve(Observe observe);
public void removeObserve(Observe observe);
public void noticeObserve();
}
rem
package com.observe.interfaceModel.www;get
public interface Observe {it
public void update(float temperature,float humidity,float perssure);
}
class
package com.observe.interfaceModel.www;
public interface DisplayInterfacce {
public void display();
}
//實現 主題接口
package com.observe.model.www;
import java.util.ArrayList;
import java.util.List;
import com.observe.interfaceModel.www.Observe;
import com.observe.interfaceModel.www.Subject;
public class WeatherDate implements Subject{
private float temperature;
private float humidity;
private float pressure;
private List<Observe> listObserve;
public WeatherDate(){
listObserve = new ArrayList<Observe>();
}
@Override
public void registerObserve(Observe observe) {
listObserve.add(observe);
}
@Override
public void removeObserve(Observe observe) {
int index = listObserve.indexOf(observe);
listObserve.remove(index);
}
@Override
public void noticeObserve() {
for(Observe observe : listObserve){
observe.update(this.temperature,this.humidity,this.pressure);
}
}
public void setChange(float temperature, float humidity, float perssure){
this.humidity = humidity;
this.temperature = temperature;
this.pressure = perssure;
noticeObserve();
}
}
//實現觀察者接口 和 表現接口
package www.obeseves.com;
import com.observe.interfaceModel.www.DisplayInterfacce;
import com.observe.interfaceModel.www.Observe;
import com.observe.interfaceModel.www.Subject;
public class TemperatureObserve implements Observe,DisplayInterfacce{
private Subject subject; //這裏仍是要保留對 主題的引用
private float temperature;
private float humidity;
public TemperatureObserve(Subject subject){
this.subject = subject;
this.subject.registerObserve(this);
}
@Override
public void display() {
System.out.println("temperature : " + this.temperature + " humidity :" + this.humidity);
}
@Override
public void update(float temperature, float humidity, float perssure) {
this.temperature = temperature;
this.humidity = humidity;
display();
}
}
package www.obeseves.com;
import com.observe.interfaceModel.www.DisplayInterfacce;
import com.observe.interfaceModel.www.Observe;
import com.observe.interfaceModel.www.Subject;
public class PerssureObserve implements Observe,DisplayInterfacce{
private Subject subject;
private float perssure;
private float humidity;
public PerssureObserve(Subject subject){
this.subject = subject;
this.subject.registerObserve(this);
}
@Override
public void display() {
System.out.println("temperature : " + this.perssure + " humidity :" + this.humidity);
}
@Override
public void update(float temperature, float humidity, float perssure) {
this.perssure = perssure;
this.humidity = humidity;
display();
}
}
package www.obeseves.com;
import com.observe.interfaceModel.www.DisplayInterfacce;
import com.observe.interfaceModel.www.Observe;
import com.observe.interfaceModel.www.Subject;
public class HumidityObserve implements Observe,DisplayInterfacce{
private Subject subject;
private float temperature;
private float perssure;
public HumidityObserve(Subject subject){
this.subject = subject;
this.subject.registerObserve(this);
}
@Override
public void display() {
System.out.println("temperature : " + this.temperature + " perssure :" + this.perssure);
}
@Override
public void update(float temperature, float humidity, float perssure) {
this.temperature = temperature;
this.perssure = perssure;
display();
}
}
// 測試類:
package www.obeseves.com;
import com.observe.model.www.WeatherDate;
public class TestObserve {
public static void main(String[] args){
WeatherDate weatherDate = new WeatherDate();
TemperatureObserve temperatureObserve = new TemperatureObserve(weatherDate);
HumidityObserve humidityObserve = new HumidityObserve(weatherDate);
PerssureObserve perssureObserve = new PerssureObserve(weatherDate);
weatherDate.setChange(10f, 80f, 40f);
weatherDate.setChange(20f, 70f, 50f);
weatherDate.setChange(30f, 60f, 30f);
}
}