Observer Observable
该实例模拟了烧水的过程,涉及三个对象,Heater(热水器),Display(显示器),Alarm(报警器).
模拟过程:为了便于运行,水的初始化温度为90,沸点为95,显示器依据热水器显示温度,显示器显示温度为95时, 报警器开始报警。明显可以看出Heater是subject ,Display 是它的 Obsrver,同时Display亦是subject,因为它要被报警器观察,所以Alarm是Display的Observer.
package com.a; import java.util.Observable; public class Heater extends Observable { private int temperature; public int getTemperature() { return temperature; } public void setTemperature(int temperature) { this.temperature = temperature; } public void boilWater() { for (int i = 90; i < 100; i++) { temperature = i; this.setChanged(); this.notifyObservers(); } } public static void main(String[] args) { Heater heater = new Heater(); Display display = new Display(); Alarm alarm = new Alarm(); heater.addObserver(display); display.addObserver(alarm); heater.boilWater(); } }
package com.a; import java.util.Observable; import java.util.Observer; public class Display extends Observable implements Observer { private String status = "未开"; public void setStatus(String status) { this.status = status; } public void displayTemputer(int temperature) { if (temperature > 95) { this.setStatus("沸腾"); this.setChanged(); this.notifyObservers(); } System.out.println("状态:" + status + " 现在温度:" + temperature + ""); } @Override public void update(Observable o, Object arg) { displayTemputer(((Heater) o).getTemperature());// 这里不是很好 } }
package com.a; import java.util.Observable; import java.util.Observer; public class Alarm implements Observer { public void makeAlarm() { System.out.println("嘀嘀嘀...水已经烧开 "); } @Override public void update(Observable o, Object arg) { makeAlarm(); } }
状态:未开 现在温度:90
状态:未开 现在温度:91
状态:未开 现在温度:92
状态:未开 现在温度:93
状态:未开 现在温度:94
状态:未开 现在温度:95
嘀嘀嘀...水已经烧开
状态:沸腾 现在温度:96
嘀嘀嘀...水已经烧开
状态:沸腾 现在温度:97
嘀嘀嘀...水已经烧开
状态:沸腾 现在温度:98
嘀嘀嘀...水已经烧开
状态:沸腾 现在温度:99

浙公网安备 33010602011771号