设计模式之观察者模式-以jdk实现为例

Posted silenceshining

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之观察者模式-以jdk实现为例相关的知识,希望对你有一定的参考价值。

一、jdk观察者模式实现代码分析:

1、Observable-被观察者(主题)

package java.util;

public class Observable {
    private boolean changed = false;
    private Vector<Observer> obs;


  //无参的构造函数
    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) {
          //如果未调用setChanged,将不会通知所有观察者更新
            if (!changed)
                return;
       //若调用了setChanged,则通知所有观察者更新
            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();
    }
}
  

  2、Observer-观察者接口

package java.util;


public interface Observer {
    //观察者更新方法 
    void update(Observable o, Object arg);
}

二、应用jdk观察者模式实现的案例:

1、被观察者(主题)

import java.util.Observable;

public class ConcreteObservable extends Observable {

	public void dataChanged(String msg) {
		setChanged();
		notifyObservers(msg);
	}

}

2、两个观察者

import java.util.Observable;
import java.util.Observer;

public class ObserverA implements Observer{

	@Override
	public void update(Observable o, Object arg) {
		System.out.println("ObserverA"+arg);
		
	}

}

  

import java.util.Observable;
import java.util.Observer;

public class ObserverB implements Observer{

	@Override
	public void update(Observable o, Object arg) {
		System.out.println("ObserverB"+arg);
		
	}

}

3、测试类

public class ObserverDemo {

	public static void main(String[] args) {

		// 添加第一个观察者
		ObserverA observerA = new ObserverA();
		ConcreteObservable observable = new ConcreteObservable();
		observable.addObserver(observerA);
		observable.dataChanged("第一次发生变化");
		System.out.println("观察者数量" + observable.countObservers());

		// 添加第二个观察者
		ObserverB observerB = new ObserverB();
		observable.addObserver(observerB);
		observable.dataChanged("第二次发生变化");
		System.out.println("观察者数量" + observable.countObservers());

	}

}

4、执行结果如下:

ObserverA第一次发生变化
观察者数量1
ObserverB第二次发生变化
ObserverA第二次发生变化
观察者数量2

 

以上是关于设计模式之观察者模式-以jdk实现为例的主要内容,如果未能解决你的问题,请参考以下文章

事件驱动之JDK观察者模式

设计模式之观察者模式与访问者模式详解和应用

设计模式 行为型模式 -- 观察者模式(发布-订阅(Publish/Subscribe)模式)

设计模式之MVC中的设计模式(连载中 12)

js 设计模式之观察者模式

JDK自带的Observable和Observer实现观察者模式