1. JDK观察模式观察者模式 事实上,它可以称为发布订阅模型 ,因为里面有一个Observable和一个Observer, 我这个Observable对于可以观察到的意思 , 意思是对外可见, 所以可以称之为出版者(publisher) , 其他的Observer可称为订阅者 (subscriber) ,对外是看不见的 .
1. Observablejava.util.Observable这个类和java.util.Observer这个类别是JDK为我们提供的框架 , 我们分析一波
文章前面已经介绍过了。 , 所以直接说, 他是管理观察者的对象
让我们看看这张图, 主要是分为addObserver方法 ,添加观察者意味着 , 与之相对应的是deleteObserver移除了,
还有就是notifyObservers通知观察者 , 别的就不多说了 , 通过一个观察者Vector维护安全数组 , 通知时,通历通知 ,
2. Observer观察者对象
public interface Observer { /** * This method is called whenever the observed object is changed. An * application calls an <tt>Observable</tt> object's * <code>notifyObservers</code> method to have all the object's * observers notified of the change. * * @param o the observable object. * @param arg an argument passed to the <code>notifyObservers</code> * method. */ void update(Observable o, Object arg);}
我们稍后再讨论他的问题。 ,
2. 基于JDK接口的实现发布者
public class MyObservable extends Observable { @Override protected synchronized void setChanged() { super.setChanged(); } @Override public synchronized void addObserver(Observer o) { super.addObserver(o); } @Override public synchronized boolean hasChanged() { return super.hasChanged(); }}
订阅者
public class MyObserver implements Observer { private String name; public MyObserver(String name) { this.name = name; } @Override public void update(Observable o, Object arg) { System.out.println(this.name+" 收到消息 : "+arg); }}
测试Demo
public class Demo { public static void main(String[] args) { MyObservable observable = new MyObservable(); // 添加观察者 observable.addObserver(new MyObserver("tom")); observable.addObserver(new MyObserver("tony")); // 必须修改, 否则无法通知 observable.setChanged(); // 通知 observable.notifyObservers(安星是个傻子); }}
输出
tony 收到消息 : 安星是个傻瓜tom 收到消息 : 安星是个傻瓜
3. 存在的问题我们发现所有的观察者都没有主动权, (这意味着观察对象没有选择性) , 管理观察者 ,通知观察者时,所有加入的观察者都会收到, 这种模式发现很有问题 , 没有隐私, 大锅饭 , 所以JDK基本上没有人关心这种模式的设计 , 一般都是自己实现的
所以直接转向 `事件监听者模式` 了