• 观察者模式


    一、模式名

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

  • 相关阅读:
    手机站测试工具(node服务器)
    [mongodb]child process failed, exited with error number 100
    正则
    VBA基础之Excel 工作薄(Book)的操作(三)
    VBA基础之Excel 工作表(Sheet)的操作(二)
    VBA基础之Excel VBA 表格的操作(一)
    基本的布局问题
    【转】jQuery最佳实践
    【转】jQuery的deferred对象详解
    2018-2019-1 20189221《Linux内核原理与分析》第二周作业
  • 原文地址:https://www.cnblogs.com/glsy/p/11148978.html
Copyright © 2020-2023  润新知