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

    java在util包中给我们提供了默认了观察者模式的类和接口。观察者可以实现Observer接口,被观察者则是使用Observable这个类来实现。首先我们来看看Observer接口和Observable类的基本使用。

    首先,我们需要定义我们的观察者实现Observer这个接口。

    package com.app.motion;
    import java.util.Observable;
    import java.util.Observer;
    
    public class CustomObserver implements Observer {
    
    private String name;
    
    public CustomObserver(String name) {
        this.name = name;
    }
    
    @Override
    public void update(Observable arg0, Object arg1) {
        if (arg1 instanceof String) {
            System.out.println(name + "say:" + arg1);
        }
    }
    
    }
    

    接着我们定义一个Obserable的继承类。

    package com.app.motion;
    
    import java.util.Observable;
    
    public class CustomObservable extends Observable{
    
    @Override
    protected synchronized void setChanged() {
        super.setChanged();
    }
    
    }
    

    客户端调用

    package com.app.motion; 
    public class Client {   
    public static void main(String[] args) {
        CustomObservable content = new CustomObservable();
        content.addObserver(new CustomObserver("zhangsan"));
        content.addObserver(new CustomObserver("lisi"));
        content.addObserver(new CustomObserver("wangwu"));
        content.setChanged();
        content.notifyObservers("update");
    }
    }
    

    最后调用结果为:

    wangwusay:update
    lisisay:update
    zhangsansay:update
    

    使用非常简单,那么我们接下来看看源码是怎么实现。首先来说说Observer接口,这个接口的定义非常简单,只有一个update方法。

    public interface Observer {
      void update(Observable o, Object arg);
    }
    

    这个方法是在Observable调用notifyObservers()方法中调用的,Observable参数代表了我们添加的被观察者,object参数代表了被观测者传递给观察者的信息.

    接下来在看看Observable类

    public class Observable {
        private boolean changed = false;
        private Vector obs;
    
        /** Construct an Observable with zero Observers. */
    
        public Observable() {
            obs = new Vector();
        }
    
    
        public synchronized void addObserver(Observer o) {
            if (o == null)
                throw new NullPointerException();
            if (!obs.contains(o)) {
                obs.addElement(o);
            }
        }
    
    
        public synchronized void deleteObserver(Observer o) {
            obs.removeElement(o);
        }
    
    
        public void notifyObservers() {
            notifyObservers(null);
        }
    
    
        public void notifyObservers(Object arg) {
            Object[] arrLocal;
    
            synchronized (this) {
    
                if (!changed)
                    return;
                arrLocal = obs.toArray();
                clearChanged();
            }
    
            for (int i = arrLocal.length-1; i>=0; i--)
                ((Observer)arrLocal[i]).update(this, arg);
        }
    
    
        public synchronized void deleteObservers() {
            obs.removeAllElements();
        }
    
    
        protected synchronized void setChanged() {
            changed = true;
        }
    
    
        protected synchronized void clearChanged() {
            changed = false;
        }
    
    
        public synchronized boolean hasChanged() {
            return changed;
        }
    
        public synchronized int countObservers() {
            return obs.size();
        }
    }
    

    Observerable这个类也比较简单,在构造方法中,新建一个Vector集合用来管理所有的Observer接口,每一次调用addObserver()方法都是把observer对象加入到vector的集合中。但某个时间需要通知所有的观察者的时候调用notifyObservers()方法,这样就可以调用每个观察者的update方法了。这里有个要注意的地方,在调用update之前,需要调用一下setChanged()方法,这个方法是一个protected方法,所以也需要继承Observable类。

  • 相关阅读:
    python之简单窗口
    hdu1237简单计算器
    BST二叉查找树的实现与操作
    huffman树入门
    hdu2043密码
    hdu1870愚人节的礼物
    hdu 2085 核反应堆
    hdu 2066 一个人的旅行(Dijkstra求最短路问题)
    hdu 2063 过山车 (二分匹配)
    hdu 2067 小兔的棋盘(Catalan数)
  • 原文地址:https://www.cnblogs.com/summerpxy/p/13648338.html
Copyright © 2011-2022 走看看