当前位置: 首页 > 图灵资讯 > 技术篇> 设计模式 - 观察者模式以及存在的问题

设计模式 - 观察者模式以及存在的问题

来源:图灵教育
时间:2023-07-02 17:09:58

观察者模式 事实上,它可以称为发布订阅模型 ,因为里面有一个Observable和一个Observer, 我这个Observable对于可以观察到的意思 , 意思是对外可见, 所以可以称之为出版者(publisher) , 其他的Observer可称为订阅者 (subscriber) ,对外是看不见的 .

1. JDK观察模式

java.util.Observable这个类和java.util.Observer这个类别是JDK为我们提供的框架 , 我们分析一波

1. Observable

文章前面已经介绍过了。 , 所以直接说, 他是管理观察者的对象

设计模式 - 观察者模式以及存在的问题_ide

让我们看看这张图, 主要是分为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基本上没有人关心这种模式的设计 , 一般都是自己实现的

所以直接转向 `事件监听者模式` 了