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具体实现就要复杂的多了。

  • 相关阅读:
    SQL存储过程基础(从基础开始学,加油!)
    SQL语句经典大全
    SQL SQL语句的增删改查
    web app iphone4 iphone5 iphone6 响应式布局 适配代码
    DOM和 jquery 基础
    HTML 和CSS 语言
    python的目标
    老男孩学习DAY11-1 进程、进程池、协程
    老男孩python DAY10 soket 编程
    老男孩全栈PYTHON -DAY8-面向妹子(对象)编程
  • 原文地址:https://www.cnblogs.com/lnlvinso/p/4771629.html
Copyright © 2011-2022 走看看