观察者模式

一、模式名

观察者模式, Observer

二、解决的问题

观察者模式,从模式名字上就可以看出该模式的功能,即观察某个对象的状态。换一中表述,可能对观察者会有更加清楚的了解,即订阅发布模式,被观察对象在状态变化时显式地通知观察对象,这种协作关系和发布订阅比较类似。被观察对象可以看作为消息的生产者,而观察对象即为消息的消费者。

观察者模式的优点就是在被观察对象状态变化时能够通知观察对象,实现被观察对象和观察对象的解耦。

三、解决方案

观察者模式的UML图如下所示

clipboard

示例代码如下:

public class ObserverExer {
    public static void main(String[] args) {
        Observable observable = new ConcreteObservable();
        Observer mqObserver = new MqObserver();
        DbObserver dbObserver = new DbObserver();
        observable.addObserver(mqObserver);
        observable.addObserver(dbObserver);

        observable.change();
    }
}

abstract class Observable {
    private List < Observer > observers = new ArrayList < >();

    private int status = 0;

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

    void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    void notifyObservers() {
        for (Observer observer: observers) {
            observer.update(this);
        }
    }

    abstract void change();

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }
}

class ConcreteObservable extends Observable {@Override void change() {
        setStatus(1);
        System.out.println("i have changed");
        notifyObservers();
    }
}

abstract class Observer {
    abstract void update(Observable observable);
}

class MqObserver extends Observer {@Override void update(Observable observable) {
        System.out.println("push message to mq " + observable.getStatus());
    }
}

class DbObserver extends Observer {@Override void update(Observable observable) {
        System.out.println("store message to DB " + observable.getStatus());
    }
}

常见应用场景:

1. 常见的事件监听器;

2. guava中的EventBus

原文地址:https://www.cnblogs.com/glsy/p/11148978.html