作用
模拟一个气象站,通过订阅的方式发布信息。
效果
温湿度布告栏订阅了气象信息完整信息布告栏订阅了气象信息[温湿度布告栏]接收到来自气象站的更新,现在更新当前显示温湿度布告栏温度:35.2F degrees 适度:22.2%[完整信息布告栏]接收到来自气象站的更新,现在更新当前显示完整信息布告栏温度:35.2F degrees 适度:22.2%气压:1000.0pa
UML
完整代码
import java.util.ArrayList;import javax.swing.text.WrappedPlainView;// 数据的类class weaterData_ST{ double temp; double humidity; double presure; public void setData(double d, double e, double presure) { this.temp = d; this.humidity = e; this.presure = presure; }}// 观察者接口interface Observer{ // 获取更新数据 public void update(weaterData_ST data); // 获取观察者名称 public String getName();}// 订阅相关接口interface Subject { public void registerObserver(Observer o); // 注册 public void removeObserver(Observer o); // 注销 public void notifyObserver(); // 通知}// 布告栏显示接口interface DisplayElement{ public void display();}// 气象站本体class WeatherStation implements Subject{ private ArrayList observers; // 订阅者列表 private weaterData_ST weaterData; // 气象数据 public WeatherStation() { // TODO Auto-generated constructor stub observers = new ArrayList(); } public void registerObserver(Observer o) { observers.add(o); System.out.println(o.getName() + "订阅了气象信息"); } public void removeObserver(Observer o) { int i = observers.indexOf(o); if (i >= 0) { observers.remove(i); } } public void notifyObserver() { for(int i = 0; i < observers.size(); i++) { // 获取订阅列表中的订阅者 Observer observer = (Observer) observers.get(i); // 调用每一个订阅者实现的更新接口来实现通知 observer.update(weaterData); } } // 当数据改变了通知所有的订阅者 public void measurementsChanged() { notifyObserver(); } public void setMeasurements(weaterData_ST data) { this.weaterData = data; measurementsChanged(); }}// 当前温湿度布告栏实现的类class CurrentConditionDisplay implements Observer, DisplayElement{ private weaterData_ST weaterData; public CurrentConditionDisplay(Subject weaterStation) { // 订阅气象站内容 weaterStation.registerObserver(this); } @Override public void update(weaterData_ST data) { // TODO Auto-generated method stub System.out.println("[" + getName() + "]" + "接收到来自气象站的更新,现在更新"); weaterData = data; display(); } @Override public void display() { // TODO Auto-generated method stub System.out.println("当前显示" + getName()); System.out.println("温度:" + weaterData.temp + "F degrees "); System.out.println("适度:" + weaterData.humidity + "%"); } @Override public String getName() { // TODO Auto-generated method stub return "温湿度布告栏"; }}// 显示完整信息的布告栏class AllConditionDisplay implements Observer, DisplayElement{ private weaterData_ST weaterData; public AllConditionDisplay(Subject weaterStation) { // TODO Auto-generated constructor stub weaterStation.registerObserver(this); } @Override public void display() { // TODO Auto-generated method stub System.out.println("当前显示" + getName()); System.out.println("温度:" + weaterData.temp + "F degrees "); System.out.println("适度:" + weaterData.humidity + "%"); System.out.println("气压:" + weaterData.presure + "pa"); } @Override public void update(weaterData_ST data) { // TODO Auto-generated method stub System.out.println("[" + getName() + "]" + "接收到来自气象站的更新,现在更新"); weaterData = data; display(); } @Override public String getName() { // TODO Auto-generated method stub return "完整信息布告栏"; }}public class main { public static void main(String[] args) { weaterData_ST weaterData = new weaterData_ST(); WeatherStation WeatherStation = new WeatherStation(); // 创建观察者订阅气象站 CurrentConditionDisplay currentConditionDisplay = new CurrentConditionDisplay(WeatherStation); AllConditionDisplay AllConditionDisplay = new AllConditionDisplay(WeatherStation); weaterData.setData(35.2, 22.2, 1000); // 只要修改了信息,那么就会通知所有订阅者 WeatherStation.setMeasurements(weaterData); }}