观察者模式

匿名 (未验证) 提交于 2019-12-02 23:47:01

一、模式名

观察者模式, 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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!