首页 > 代码库 > 观察者模式

观察者模式

  • 定义

观察者模式定义了对象之间的一对多依赖,当一个对象改变时。所以依赖于它的对象都会得到通知。

  • 演示样例
interface Observer {
    void update(int data);
}

class NewsPaper {
    private LinkedList<Observer> observers;

    public NewsPaper() {
        observers = new LinkedList<>();
    }

    public void subscribe(Observer o) {
        observers.add(o);
    }

    public void unsubscribe(Observer o) {
        observers.remove(o);
    }

    public void changeData(int data) {
        for (Observer o : observers) {
            o.update(data);
        }
    }
}

class Reader implements Observer {
    private String name;

    public Reader(NewsPaper paper, String name) {
        this.name = name;
        paper.subscribe(this);
    }

    @Override
    public void update(int data) {
        System.out.println(name + " update data:" + data);
    }
}

public class TestObserve {
    public static void main(String[] args) {
        NewsPaper newsPaper = new NewsPaper();
        Reader tom = new Reader(newsPaper, "tom");
        Reader jack = new Reader(newsPaper, "jack");
        newsPaper.changeData(10);
        System.out.println("--");
        newsPaper.unsubscribe(tom);
        newsPaper.changeData(5);
    }
}

全部 Reader 都是观察者,当他订阅了 NewsPaper 后。NewsPaper 一有新数据,就会通知全部订阅了它的 Reader。

  • 为什么

为什么要使用观察者模式?由于在初始化被观察者时,并不知道当数据变化时。须要通知谁。

须要通知的对象是动态变化的。

  • 谁还用了观察者模式

在 GUI 编程时。我们想要在事件被触发时,运行我们指定的动作。

比如想在button被点击时弹窗体。就能够通过类似AddListener。将已经实现对应接口的对象加入到button的“订阅列表”中。当button被点击时,系统会依次调用“订阅列表”中对象的对应方法。弹窗体因此被触发。

观察者模式