设计模式——观察者模式

151 阅读1分钟

1. 观察者模式概述

当对象间存在一对多关系时,则使用观察者模式。
比如,当一个对象被修改时,则会自动通知依赖它的对象。

(1) 适用情况

一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。

(2) 优点

异步,观察者和被观察者是松耦合的。

(3) 缺点

当观察者过多,广播通知时会花费很多时间。

2. 观察者模式实例

小明、小红和小亮都想买商家的宝贝,但是目前没有货,于是他们都等着,一旦商家到货,就立刻买下宝贝。
这里没有处理多线程和超卖的问题,只是展示观察者模式的思想。

(1) 实现主题类,也就是商家

public class Subject {
    private List<Observer> observers = new ArrayList<>();

    private int stock;

    public void addObserver(Observer observer) {
        observers.add(observer);
    }

    public void setStock(int stock) {
        this.stock = stock;
        // 提醒所有观察者
        notifyAllObservers();
    }

    private void notifyAllObservers() {
        for (Observer observer : observers) {
            if (stock > 0) {
                observer.buy();
                stock--;
            } else {
                System.out.println("宝贝被抢光啦!");
            }
        }
    }
}

(2) 实现观察者类,也就是买家

public class Observer {
    private String name;

    public Observer(String name) {
        this.name = name;
    }

    public void buy() {
        System.out.println(name + ": 我抢到了宝贝!");
    }
}

(3) 开始抢购

public class ObserverDemo {
    public static void main(String[] args) {
        // 创建一个主题,也就是商家
        Subject subject = new Subject();

        // 创建三个观察者,也就是买家
        Observer observer1 = new Observer("小明");
        Observer observer2 = new Observer("小红");
        Observer observer3 = new Observer("小亮");

        // 三个买家都想买商家的宝贝,于是都注册到商家
        subject.addObserver(observer1);
        subject.addObserver(observer2);
        subject.addObserver(observer3);

        // 商家上货啦
        subject.setStock(2);
    }
}

运行结果:

image.png

3. 一些思考

观察者模式是一种很实用的模式,被观察者不用再同步阻塞着等待被观察者的状态改变。spring中的监听器就是使用了观察者模式的思想。

参考引用

观察者模式:www.runoob.com/design-patt…