zoukankan      html  css  js  c++  java
  • 观察者模式

      在实际应用中,当一个对象关注另一个对象的变化时,可以采取轮询的方式,也可以采用观察者模式来实现。

      采用观察者模式时,被关注者发生变化时会去通知在其上注册的观察者。Swing中就大量的用到了观察者模式来实现监听组件状态的变化。

      

      观察者模式的类图如下:

      

      

      Subject上注册关注其变化的Observer,当Subject状态发生变化时,逐个的去通知Observer。

    public void nodifyObservers(String newState){
            
            for(Observer observer : list){
                observer.update(newState);
            }
        }

      

      JDK中也支持观察者模式,使用JDK提供的Observable类和Observer接口可以轻松完成观察者模式。

      Observable相当于主题,是被关注的。addObserver(Observer o)增加观察者,发生变化时  setChanged();设置 boolean changed = true再调用notifyObservers();即可。

      JButton继承自AbstractButton,AbstractButton中也维护了一组监听器ActionListener(观察者),当JButton状态发生变化时,通过firActionPerformed()方法去逐个调用ActionListener的actionPerformed方法。

      这也就是为什么为什么在JButton上注册了一些ActionListener,当JButton状态发生变化时,就会调用到ActionListener的actionPerformed方法。

      当主题上注册了很多个观察者时,主题每次发生变化时都去调用所有的观察者,而观察者只是关注主题的某些类型的变化时,这就是效率的浪费。

      可以在主题上注册不同类型的观察者,当发生变化时只去通知关注的观察者。感觉这个和消息的实现机制就已经很类似了,可以去订阅关注的信息。

      NIO中的Selector类似于主题,主题上注册了各种观察者,当主题发生变化时,去通知感兴趣的观察者。Selector具体实现就要复杂的多了。

  • 相关阅读:
    [总结]链表与栈
    统计学基础知识
    图卷积神经网络(GCN)入门
    [总结]字符串
    [总结]数组
    [总结]排序算法分析与实现
    [Leetcode]307. Range Sum Query
    深度解析Droupout与Batch Normalization
    深度解析Graph Embedding
    Console命令,让js调试更简单
  • 原文地址:https://www.cnblogs.com/lnlvinso/p/4771629.html
Copyright © 2011-2022 走看看