作用

模拟一个气象站,通过订阅的方式发布信息。

效果

  1. 温湿度布告栏订阅了气象信息
  2. 完整信息布告栏订阅了气象信息
  3. [温湿度布告栏]接收到来自气象站的更新,现在更新
  4. 当前显示温湿度布告栏
  5. 温度:35.2F degrees
  6. 适度:22.2%
  7. [完整信息布告栏]接收到来自气象站的更新,现在更新
  8. 当前显示完整信息布告栏
  9. 温度:35.2F degrees
  10. 适度:22.2%
  11. 气压:1000.0pa

UML

图片.png

完整代码

  1. import java.util.ArrayList;
  2. import javax.swing.text.WrappedPlainView;
  3. // 数据的类
  4. class weaterData_ST{
  5. double temp;
  6. double humidity;
  7. double presure;
  8. public void setData(double d, double e, double presure) {
  9. this.temp = d;
  10. this.humidity = e;
  11. this.presure = presure;
  12. }
  13. }
  14. // 观察者接口
  15. interface Observer{
  16. // 获取更新数据
  17. public void update(weaterData_ST data);
  18. // 获取观察者名称
  19. public String getName();
  20. }
  21. // 订阅相关接口
  22. interface Subject {
  23. public void registerObserver(Observer o); // 注册
  24. public void removeObserver(Observer o); // 注销
  25. public void notifyObserver(); // 通知
  26. }
  27. // 布告栏显示接口
  28. interface DisplayElement{
  29. public void display();
  30. }
  31. // 气象站本体
  32. class WeatherStation implements Subject{
  33. private ArrayList observers; // 订阅者列表
  34. private weaterData_ST weaterData; // 气象数据
  35. public WeatherStation() {
  36. // TODO Auto-generated constructor stub
  37. observers = new ArrayList();
  38. }
  39. public void registerObserver(Observer o) {
  40. observers.add(o);
  41. System.out.println(o.getName() + "订阅了气象信息");
  42. }
  43. public void removeObserver(Observer o) {
  44. int i = observers.indexOf(o);
  45. if (i >= 0) {
  46. observers.remove(i);
  47. }
  48. }
  49. public void notifyObserver() {
  50. for(int i = 0; i < observers.size(); i++) {
  51. // 获取订阅列表中的订阅者
  52. Observer observer = (Observer) observers.get(i);
  53. // 调用每一个订阅者实现的更新接口来实现通知
  54. observer.update(weaterData);
  55. }
  56. }
  57. // 当数据改变了通知所有的订阅者
  58. public void measurementsChanged() {
  59. notifyObserver();
  60. }
  61. public void setMeasurements(weaterData_ST data) {
  62. this.weaterData = data;
  63. measurementsChanged();
  64. }
  65. }
  66. // 当前温湿度布告栏实现的类
  67. class CurrentConditionDisplay implements Observer, DisplayElement{
  68. private weaterData_ST weaterData;
  69. public CurrentConditionDisplay(Subject weaterStation) {
  70. // 订阅气象站内容
  71. weaterStation.registerObserver(this);
  72. }
  73. @Override
  74. public void update(weaterData_ST data) {
  75. // TODO Auto-generated method stub
  76. System.out.println("[" + getName() + "]" + "接收到来自气象站的更新,现在更新");
  77. weaterData = data;
  78. display();
  79. }
  80. @Override
  81. public void display() {
  82. // TODO Auto-generated method stub
  83. System.out.println("当前显示" + getName());
  84. System.out.println("温度:" + weaterData.temp + "F degrees ");
  85. System.out.println("适度:" + weaterData.humidity + "%");
  86. }
  87. @Override
  88. public String getName() {
  89. // TODO Auto-generated method stub
  90. return "温湿度布告栏";
  91. }
  92. }
  93. // 显示完整信息的布告栏
  94. class AllConditionDisplay implements Observer, DisplayElement{
  95. private weaterData_ST weaterData;
  96. public AllConditionDisplay(Subject weaterStation) {
  97. // TODO Auto-generated constructor stub
  98. weaterStation.registerObserver(this);
  99. }
  100. @Override
  101. public void display() {
  102. // TODO Auto-generated method stub
  103. System.out.println("当前显示" + getName());
  104. System.out.println("温度:" + weaterData.temp + "F degrees ");
  105. System.out.println("适度:" + weaterData.humidity + "%");
  106. System.out.println("气压:" + weaterData.presure + "pa");
  107. }
  108. @Override
  109. public void update(weaterData_ST data) {
  110. // TODO Auto-generated method stub
  111. System.out.println("[" + getName() + "]" + "接收到来自气象站的更新,现在更新");
  112. weaterData = data;
  113. display();
  114. }
  115. @Override
  116. public String getName() {
  117. // TODO Auto-generated method stub
  118. return "完整信息布告栏";
  119. }
  120. }
  121. public class main {
  122. public static void main(String[] args) {
  123. weaterData_ST weaterData = new weaterData_ST();
  124. WeatherStation WeatherStation = new WeatherStation();
  125. // 创建观察者订阅气象站
  126. CurrentConditionDisplay currentConditionDisplay = new CurrentConditionDisplay(WeatherStation);
  127. AllConditionDisplay AllConditionDisplay = new AllConditionDisplay(WeatherStation);
  128. weaterData.setData(35.2, 22.2, 1000);
  129. // 只要修改了信息,那么就会通知所有订阅者
  130. WeatherStation.setMeasurements(weaterData);
  131. }
  132. }