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

  • 相关阅读:
    jQueryEasyUi行编辑打造增删改查
    css样式DEMO
    jqueryEasyui常用代码
    Jquery easyui tree 一些常见操作
    EasyUI项目中的自定义JS
    easyui里弹窗的两种表现形式
    EasyUI扩展方法
    JS-easyui 扩展easyui.datagrid,添加数据loading遮罩效果代码
    Being a Hero (hdu 3251 最小割 好题)
    AWS携手上海嘉定政府推出首个联合孵化器 为创业公司拓展AWS云服务可用资源
  • 原文地址:https://www.cnblogs.com/glsy/p/11148978.html
Copyright © 2011-2022 走看看