美文网首页
chapter02_观察者模式

chapter02_观察者模式

作者: 米都都 | 来源:发表于2019-01-06 17:03 被阅读0次
  • 观察者模式 = 主题(Subject) + 观察者(Observer)

    观察者注册到主题上, 这样在主题数据改变时就会通知观察者;

    主题对象会管理某些数据;

    当主题对象中的数据改变时, 就会通知观察者

  • 观察者模式

    定义了对象之间的一对多依赖, 这样一来当一个对象改变状态时, 它的所有依赖者都会收到通知并自动更新

  • 观察者的实现方式有好几种, 常见的是有一个Subject和一个Observer接口

    Observeer中有一个update()方法, 当主题中的数据改变时, 会调用关联的Observer的update()方法

  • 观察者提供了一种设计方法, 使得主题和观察者之间松耦合

  • Java中提供了内置的观察者模式的支持: Observer接口和Observable类, 但是从JDK9之后被Deprecated了

  • 观察者模式有两种做法:

    推的方式: 当主题Subject内部有数据更新时, 调用它关联的Observer的update()方法;

    示例

      public void update(float temperature, float humidity, float pressure) {
          
          this.temperature = temperature;
          this.humidity = humidity;
      
          display();
      }
    

    拉的方式: 当Observer需要update时, 它调用关联的Subject的get()方法

    示例

      public void update(Observable obs, Object arg) {
    
          if (obs instanceof WeatherData) {
              WeatherData weatherData = (WeatherData) obs;
              this.temperature = weatherData.getTemperature();
              this.humidity = weatherData.getHumidity();
      
              display();
          }
      }
    

    可以看到"拉的方式"使用了关联的WeatherData对象的getTemperature和getHumidity方法

    一般认为, "推的方式"更合理

  • 设计原则:

    为交互对象之间的松耦合设计而努力

  • Swing中大量应用观察者模式, 例如某个控件绑定了很多事件, 当动作发生时, 会触发这些事件

    示例

      public class SwingObserverExample {
    
          JFrame frame;
    
          public static void main(String[] args) {
      
              SwingObserverExample example = new SwingObserverExample();
              example.go();
          }
    
          public void go() {
    
              frame = new JFrame();
    
              JButton button = new JButton("Should I do it?");
    
              button.addActionListener(new AngelListener());
              button.addActionListener(new DevilListener());
    
              frame.getContentPane().add(BorderLayout.CENTER, button);
    
              // Set frame properties
              frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
              frame.setSize(300, 300);
              frame.setVisible(true);
          }
    
          class AngelListener implements ActionListener {
    
              public void actionPerformed(ActionEvent event) {
    
                  System.out.println("Don't do it, you might regret it!");
              }
          }
    
          class DevilListener implements ActionListener {
    
              public void actionPerformed(ActionEvent event) {
    
                  System.out.println("Come on, do it!");
              }
          }
      }
    

相关文章

  • chapter02_观察者模式

    观察者模式 = 主题(Subject) + 观察者(Observer)观察者注册到主题上, 这样在主题数据改变时就...

  • 11.9设计模式-观察者模式-详解

    设计模式-观察者模式 观察者模式详解 观察者模式在android中的实际运用 1.观察者模式详解 2.观察者模式在...

  • RxJava基础—观察者模式

    设计模式-观察者模式 观察者模式:观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式...

  • 前端面试考点之手写系列

    1、观察者模式 观察者模式(基于发布订阅模式) 有观察者,也有被观察者。 观察者需要放到被观察者列表中,被观察者的...

  • RxJava 原理篇

    一、框架思想 观察者模式观察者自下而上注入被观察者被观察者自上而下发射事件观察者模式 装饰器模式自上而下,被观察者...

  • 观察者模式

    观察者模式概念 观察者模式是对象的行为模式,又叫作发布-订阅(publish/subscrible)模式。 观察者...

  • 设计模式-观察者模式

    观察者模式介绍 观察者模式定义 观察者模式(又被称为发布-订阅(Publish/Subscribe)模式,属于行为...

  • 观察者模式

    观察者模式 观察者模式的定义 观察者模式(Observer Pattern)也叫做发布订阅模式(Publish/s...

  • iOS设计模式之观察者模式

    观察者模式 1、什么是观察者模式 观察者模式有时又被称为发布(publish)-订阅(Subscribe)模式、模...

  • 观察者模式和发布订阅模式区别

    观察者模式 所谓观察者模式,其实就是为了实现松耦合(loosely coupled)。 在观察者模式中,观察者需要...

网友评论

      本文标题:chapter02_观察者模式

      本文链接:https://www.haomeiwen.com/subject/txwsrqtx.html