zoukankan      html  css  js  c++  java
  • 观察者模式

    一、模式名

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

  • 相关阅读:
    springboot—spring aop 实现系统操作日志记录存储到数据库
    排名前16的Java工具类
    SpringBoot集成JWT实现token验证
    使用jQuery实现图片懒加载原理
    Spring主从数据库的配置和动态数据源切换原理
    使用Nginx过滤网络爬虫
    Java io.netty.util.ReferenceCountUtil 代码实例
    Netty系列之Netty百万级推送服务设计要点
    Java给图片和PDF文件添加水印(图片水印和文字水印)
    【TortoiseSVN】windows中连接SVN服务器的工具
  • 原文地址:https://www.cnblogs.com/glsy/p/11148978.html
Copyright © 2011-2022 走看看