• Java中内置的观察者模式


    Java中内置的观察者模式

     

    Observable类

      java.util.Observable

      http://docs.oracle.com/javase/7/docs/api/java/util/Observable.html

     

      Observable类用于创建可以观测到你的程序中其他部分的子类。当这种子类的对象发生变化时,观测类被通知。

      观测类必须实现定义了update()方法的Observer接口

      当一个观测程序被通知到一个被观测对象的改变时,update()方法被调用。

      显然,Observable是一个抽象的主题对象

      一个被观测的对象必须服从下面的两个简单规则:

      第一,如果它被改变了,它必须调用setChanged()方法。

      第二,当它准备通知观测程序它的改变时,它必须调用notifyObservers()方法,这导致了在观测对象中对update()方法的调用。

      注意:如果在调用notifyObservers()方法之前没有调用setChanged()方法,就不会有什么动作发生。

      notifyObservers()方法中包含clearChanged()方法,将标志变量置回原值。

      notifyObservers()方法采用的是从后向前的遍历方式,即最后加入的观察者最先被调用update()方法。

     

    Observer接口

      java.util.Observer

      http://docs.oracle.com/javase/7/docs/api/java/util/Observer.html

      此接口中只有一个方法:

      void update(Observable o, Object arg) 

      这个方法在被观察对象(Observable类)的notifyObservers()方法中被调用。

     

    程序例子

      定义一个主题对象进行倒数计数,数字每次改变时,它的观察者收到这个数字。

      一个观察者每次收到通知后打印出数字,另一个观察者在数字小于等于5时才开始打印。

     

    package com.learnjava.observer;
    
    import java.util.Observable;
    import java.util.Observer;
    
    class WatchedCounter extends Observable
    {
        public void countdown(int number)
        {
            for (; number >= 0; --number)
            {
                // 设置改变变量
                setChanged();
    
                // 通知所有观察者,将number作为参数信息传递给观察者
                notifyObservers(number);
    
            }
    
        }
    }
    
    class Watcher1 implements Observer
    {
        @Override
        public void update(Observable arg0, Object arg1)
        {
            System.out.println("Watcher1's number: " + arg1);
    
        }
    }
    
    class Watcher2 implements Observer
    {
        @Override
        public void update(Observable arg0, Object arg1)
        {
    
            if (((Integer) arg1).intValue() <= 5)
            {
                System.out.println("Watcher2's number: " + arg1);
            }
        }
    }
    
    public class ObserverTest
    {
        public static void main(String[] args)
        {
            WatchedCounter watchedCounter = new WatchedCounter();
            Watcher1 watcher1 = new Watcher1();
            Watcher2 watcher2 = new Watcher2();
    
            //添加观察者
            watchedCounter.addObserver(watcher1);
            watchedCounter.addObserver(watcher2);
    
            //开始倒数计数
            watchedCounter.countdown(10);
        }
    
    }

     

    参考资料

      张龙老师Java SE系列视频教程。

      本博客中关于观察者模式的文章:

      Java读书笔记12 事件处理基础 Observer设计模式:

      http://www.cnblogs.com/mengdd/archive/2012/09/08/2676587.html

      《Head First设计模式》 读书笔记02 观察者模式 Observer:

      http://www.cnblogs.com/mengdd/archive/2013/01/03/2843298.html

      Java 事件模型基础:监听器、事件、事件源、事件注册:

      http://www.cnblogs.com/mengdd/archive/2013/02/06/2908241.html

      观察者模式及Java实现例子:

      http://www.cnblogs.com/mengdd/archive/2013/02/07/2908929.html

     

  • 相关阅读:
    flex 布局
    5个有用的 CSS 布局生成器
    js 函数
    js 类定义的方法(最终)
    js && ||
    css position 盒子模型
    eldatepicker选择时间,限定选择的时间段
    Java基础学习总结——Java对象的序列化和反序列化
    pytorch自定义算子
    网站上视频下载后保存为MP4格式
  • 原文地址:https://www.cnblogs.com/mengdd/p/2909206.html
Copyright © 2020-2023  润新知