观察者模式
一、模式名
观察者模式, Observer
二、解决的问题
观察者模式,从模式名字上就可以看出该模式的功能,即观察某个对象的状态。换一中表述,可能对观察者会有更加清楚的了解,即订阅发布模式,被观察对象在状态变化时显式地通知观察对象,这种协作关系和发布订阅比较类似。被观察对象可以看作为消息的生产者,而观察对象即为消息的消费者。
观察者模式的优点就是在被观察对象状态变化时能够通知观察对象,实现被观察对象和观察对象的解耦。
三、解决方案
观察者模式的UML图如下所示
示例代码如下:
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