经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
设计模式之观察者模式
来源:cnblogs  作者:迷途纸鸢  时间:2019/8/7 8:50:24  对本文有异议

首先让我们来看一下定义 

                                       观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,他的所

                                       有以来都会收到通知并自动更新。

 

观察者模式 = 出版者(主题Subject)+ 订阅者(观察者Observer)

现在来看一个通俗易懂的图,进而对观察者模式有进一步了解:

 

然后让我们利用观察这模式来做一个简单的气象监测应用:

项目概况了解:此系统中的三个部分分别是气象站(获取市级气象数据的物理装置),WeatherData对象(追中来自

气象站的数据,并更新布告板)和布告板(显示目前天气状况给用户看)。

 

WeatherData对象知道如何跟物理气象站联系,以获得更新的数据。WeatherData对象会随机更新三个布告板的显

示;目前状况(温度、湿度、气压)、气象统计和天气预报。

接下来看一下这个系统的设计图(运用观察者模式):

 

我们实现ForecastDisplay显示器,其他两个不用管,都和ForecastDisplay大同小异。

项目的实施:

首先是我们的三个接口:

Subject.java:

  1. 1 public interface Subject {
  2. 2 public void registerObserver(Observer o);//注册观察者
  3. 3 public void removeObserver(Observer o); //删除观察者
  4. 4 public void notifyObservers(); //提示更新
  5. 5 }

Observer.java:

  1. 1 public interface Observer {
  2. 2 public void update(float temp, float humidity, float pressure); //更新数据
  3. 3 }

DisplayElement.java:

  1. 1 public interface DisplayElement {
  2. 2 public void display();
  3. 3 }

Weather.java(实现主题):

  1. 1 import java.util.ArrayList;
  2. 2
  3. 3 public class WeatherData implements Subject{
  4. 4 private ArrayList<Observer> observers;
  5. 5 private float temperature; //温度
  6. 6 private float humidity; //湿度
  7. 7 private float pressure; //气压
  8. 8
  9. 9 public WeatherData(){
  10. 10 observers = new ArrayList<Observer>();
  11. 11 }
  12. 12
  13. 13 //注册观察者
  14. 14 public void registerObserver(Observer o){
  15. 15 observers.add(o);
  16. 16 }
  17. 17
  18. 18 //删除观察者
  19. 19 public void removeObserver(Observer o){
  20. 20 int i = observers.indexOf(o);
  21. 21 if(i >= 0){
  22. 22 observers.remove(i);
  23. 23 }
  24. 24 }
  25. 25
  26. 26 //获取数据,从而更新
  27. 27 public void notifyObservers(){
  28. 28 for (Observer observer: observers){
  29. 29 observer.update(temperature, humidity, pressure);
  30. 30 }
  31. 31 }
  32. 32
  33. 33 //监测数据变化,从而触发数据更新
  34. 34 public void measurementsChanged() {
  35. 35 notifyObservers();
  36. 36 }
  37. 37
  38. 38 //设置更新数据
  39. 39 public void setMeasurements(float temperature, float humidity, float pressure) {
  40. 40 this.temperature = temperature;
  41. 41 this.humidity = humidity;
  42. 42 this.pressure = pressure;
  43. 43 measurementsChanged();
  44. 44 }
  45. 45
  46. 46 //下面是三个getter,分别是获取温度、湿度、气压
  47. 47 public float getTemperature() {
  48. 48 return temperature;
  49. 49 }
  50. 50
  51. 51 public float getHumidity() {
  52. 52 return humidity;
  53. 53 }
  54. 54
  55. 55 public float getPressure() {
  56. 56 return pressure;
  57. 57 }
  58. 58 }

开始建立布告板:

CurrentCOnditionsDisplay.java:

  1. 1 //实现Observer和DisplayElement连个接口,说白了就是实现update和display两个方法
  2. 2 public class CurrentConditionsDisplay implements Observer,DisplayElement{
  3. 3 private float temperature;
  4. 4 private float humidity;
  5. 5 private Subject weatherData;
  6. 6
  7. 7 public CurrentConditionsDisplay(Subject weatherData) {
  8. 8 this.weatherData = weatherData;
  9. 9 weatherData.registerObserver(this);
  10. 10 }
  11. 11
  12. 12 public void update(float temperature, float humidity, float pressure) {
  13. 13 this.temperature = temperature;
  14. 14 this.humidity = humidity;
  15. 15 display();
  16. 16 }
  17. 17
  18. 18 public void display() {
  19. 19 System.out.println("Current conditions: " + temperature
  20. 20 + "F degrees and " + humidity + "% humidity");
  21. 21 }
  22. 22 }

最后让我们添加一个测试类:

Main.java:

  1. 1 public class Main {
  2. 2
  3. 3 public static void main(String[] args) {
  4. 4 WeatherData weatherData = new WeatherData();
  5. 5 CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weatherData);
  6. 6 // StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData); //这两个布告板都是大同小异
  7. 7 // ForecastDisplay forecastDisplay = new ForecastDisplay(weatherData); //有兴趣的读者可以去我的GitHub上面下载
  8. 8
  9. 9 weatherData.setMeasurements(80, 65, 30.4f);
  10. 10 weatherData.setMeasurements(82, 70, 29.2f);
  11. 11 weatherData.setMeasurements(78, 90, 29.2f);
  12. 12 }
  13. 13 }

 

测试结果:

 

此项目的GitHub地址:

https://github.com/Stray-Kite/Design-Pattern/tree/master/src/headfirst/designpatterns/observer/weather

原文链接:http://www.cnblogs.com/Trojan00/p/11308189.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号