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

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

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

package java.util;

public class Observable {

private boolean changed = false;

private Vector 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值