设计模式--观察者模式

深藏阁楼爱情的钟 2022-04-23 13:52 398阅读 0赞

观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。
watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zOTU5Mzk4NQ_size_16_color_FFFFFF_t_70
观察者模式是一种对象行为型模式,其主要优点如下。

  1. 降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。
  2. 目标与观察者之间建立了一套触发机制。

它的主要缺点如下。

  1. 目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用。
  2. 当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率。watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zOTU5Mzk4NQ_size_16_color_FFFFFF_t_70 1选责任链吧B?

    • 被观察者(Subject)具有注册和移除观察者、并通知所有观察者的功能,(Subject)是通过维护一张观察者列表来实现这些操作的。
    • 观察者(Observer)的注册功能需要调用被观察者的 registerObserver() 方法。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl8zOTU5Mzk4NQ_size_16_color_FFFFFF_t_70 2

  1. //只要实现了接口 相应的类也都需要实现
  2. public interface Subject {
  3. //注册
  4. void registerObserver(Observer o);
  5. //移除
  6. void removeObserver(Observer o);
  7. //通知
  8. void notifyObserver();
  9. }
  10. public interface Observer {
  11. void update(float temp, float humidity, float pressure);
  12. }
  13. public class WeatherData implements Subject {
  14. //用一张list<观察者>链表来存储,需要被通知的观察对象
  15. private List<Observer> observers;
  16. private float temperature;
  17. private float humidity;
  18. private float pressure;
  19. //构造函数 创建被观察者weatherdata天气数据 同时创建一个观察者链表
  20. public WeatherData() {
  21. observers = new ArrayList<>();
  22. }
  23. //set修改update了数据后 就通知list链表中的所有观察者
  24. public void setMeasurements(float temperature, float humidity, float pressure) {
  25. this.temperature = temperature;
  26. this.humidity = humidity;
  27. this.pressure = pressure;
  28. notifyObserver();
  29. }
  30. @Override
  31. public void registerObserver(Observer o) {
  32. observers.add(o);
  33. }
  34. @Override
  35. public void removeObserver(Observer o) {
  36. int i = observers.indexOf(o);
  37. if (i >= 0) {
  38. observers.remove(i);
  39. }
  40. }
  41. @Override
  42. public void notifyObserver() {
  43. for (Observer o : observers) {
  44. o.update(temperature, humidity, pressure);
  45. }
  46. }
  47. }
  48. public class StatisticsDisplay implements Observer {//统计显示
  49. //构造方法 注册
  50. public StatisticsDisplay(Subject weatherData) {
  51. weatherData.reisterObserver(this);
  52. }
  53. @Override
  54. public void update(float temp, float humidity, float pressure) {
  55. System.out.println("StatisticsDisplay.update: " + temp + " " + humidity + " " + pressure);
  56. }
  57. }
  58. public class CurrentConditionsDisplay implements Observer {//目前情况显示
  59. public CurrentConditionsDisplay(Subject weatherData) {
  60. weatherData.registerObserver(this);
  61. }
  62. @Override
  63. public void update(float temp, float humidity, float pressure) {
  64. System.out.println("CurrentConditionsDisplay.update: " + temp + " " + humidity + " " + pressure);
  65. }
  66. }
  67. public class WeatherStation {//气象站
  68. public static void main(String[] args) {
  69. WeatherData weatherData = new WeatherData();
  70. //观察者(被通知对象)需要有一个有参的构造方法(传入被观察者) 与被观察者进行绑定
  71. CurrentConditionsDisplay currentConditionsDisplay = new CurrentConditionsDisplay(weatherData);
  72. StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData);
  73. weatherData.setMeasurements(0, 0, 0);
  74. weatherData.setMeasurements(1, 1, 1);
  75. }
  76. }

观察者模式主要是要实现观察者在被观察者对象中完成注册的动作

  1. public class Test {
  2. public static void main(String[] args) {
  3. WechatServer server = new WechatServer();
  4. Observer userZhang = new User("ZhangSan");
  5. Observer userLi = new User("LiSi");
  6. Observer userWang = new User("WangWu");
  7. //注册
  8. server.registerObserver(userZhang);
  9. server.registerObserver(userLi);
  10. server.registerObserver(userWang);
  11. server.setInfomation("PHP是世界上最好用的语言!");
  12. System.out.println("----------------------------------------------");
  13. server.removeObserver(userZhang);
  14. server.setInfomation("JAVA是世界上最好用的语言!");
  15. }
  16. }

发表评论

表情:
评论列表 (有 0 条评论,398人围观)

还没有评论,来说两句吧...

相关阅读

    相关 设计模式-观察模式

    观察者模式 引言 > 今天开车出去有事,还挺赶时间的,突然遇到了一个红灯,这红灯时间可真长,等了好久终于看到变绿灯了,赶紧开车过去。 正文 观察者模式是指多

    相关 设计模式-观察模式

    观察者模式也叫订阅发布模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。

    相关 设计模式——观察模式

      观察者模式——定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生改变时,会通知所有观察者对象,使它们能够自动更新自己。   观察者

    相关 设计模式:观察模式

    一.简介 > QT的信号槽就是观察者模式,当事件发生之后(比如按钮被点击)就会发出一个信号,这种信号类似广播没有目的.当对象对信号感兴趣,就会通过 connect() 函

    相关 设计模式--观察模式

    定义 在对象之间定义了一对多的依赖,当一方发生改变时,依赖它的对象都会受到通知并自动更新。 其实可以理解为消息发布者(被观察者)与订阅者(观察者),用户可以订阅或者取消