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

  • 相关阅读:
    修复TabControl在Binding情况下Canvas被复用的问题
    避免缓加载时因违反惯例导致的空引用!
    乱说一气
    WPF中的数据验证
    [zz]GPU architecture
    [zz]DirectX 11 and Shared Model 5.0
    网页栅格系统中的最佳宽度:960px
    复习html标签及其属性
    去除链接虚线边框css
    使用jquery解决IE6不兼容的伪类
  • 原文地址:https://www.cnblogs.com/glsy/p/11148978.html
Copyright © 2011-2022 走看看