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

    观察者模式

    定义

    观察者模式又称为发布/订阅(Publish/Subscribe)模式。它定义了一种一对多的依赖关系,多个观察者对象可同时监听某一主题对象当该主题对象状态发生变化时,相应的所有观察者对象都可以收到通知。

    角色划分

    <>(观察者关注的事件)
      + update(Event event)
    Observer1
      + update(Event event)
    Observer2
      + update(Event event)

    AbstractSubject
      allObserver:Collection
      + addObserver(Observer observer)
      + removeObserver(Observer observer)
      + notifyObserver(Event event):void
    Subject1
      + addObserver(Observer observer)
      + removeObserver(Observer observer)
      + notifyObserver(Event event):void
    Subject2
      + addObserver(Observer observer)
      + removeObserver(Observer observer)
      + notifyObserver(Event event):void
    观察者模式角色划分
      主题,抽象类或接口,如上面类图中的AbstractSubject
      具体主题,如上面类图中的Subject1,Subject2
      观察者,如上面类图中的IObserver
      具体观察者,如上面类图中的Observer1,Observer2

    示列代码

    //观察者接口
    public interface Observer {
        public void update(String message);
    }
    
    /**
     * 具体观察者
     * 实现了update方法
    */
    public class User implements Observer {
        private String name;
        private String message;
        public User(String name) {
            this.name = name;
        }
        //得到通知之后所作出的反应
        @Override
        public void update(String message) {
            this.message = message;
            read();
        }
        public void read() {
            System.out.println(name + " 收到推送消息: " + message);
        } 
    }
    
    public interface Subject{ 
        public void registerObserver(Observer o);
        public void removeObserver(Observer o);
        public void notifyObserver();
        
    }
    
    /**
     * 被观察者,也就是微信公众号服务
     * 实现了Observerable接口,对Observerable接口的三个方法进行了具体实现
     * @author jstao
     *
     */
    public class WechatSubject implements Subject{
        
        //注意到这个List集合的泛型参数为Observer接口,设计原则:面向接口编程而不是面向实现编程
        private List<Observer> list;
        private String message;
        
        public WechatSubject() {
            list = new ArrayList<Observer>();
        }
        //添加观察者
        @Override
        public void registerObserver(Observer o) {
            list.add(o);
        }
        //删除观察者
        @Override
        public void removeObserver(Observer o) {
            if(!list.isEmpty())
                list.remove(o);
        }
        //遍历通知
        @Override
        public void notifyObserver() {
            for(int i = 0; i < list.size(); i++) {
                Observer oserver = list.get(i);
                //通知具体的观察者
                oserver.update(message);
            }
        } 
        public void setInfomation(String s) {
            this.message = s;
            System.out.println("微信服务更新消息: " + s);
            //消息更新,通知所有观察者
            notifyObserver();
        }
    }
    

    优缺点

    观察者模式优点
      抽象主题只依赖于抽象观察者
      观察者模式支持广播通信
      观察者模式使信息产生层和响应层分离
    观察者模式缺点
      如一个主题被大量观察者注册,则通知所有观察者会花费较高代价
      如果某些观察者的响应方法被阻塞,整个通知过程即被阻塞,其它观察者不能及时被通知

  • 相关阅读:
    ($children,$refs,$parent)的使用
    watch监听变化
    vue组件间通信六种方式(完整版)
    CSS水平垂直居中常见方法总结2
    CSS水平垂直居中常见方法总结
    Uncaught SyntaxError: Unexpected identifier 报错 import Vue from 'vue';
    前端跳槽面试必备
    防止重复发送Ajax请求问题
    JQuery中的$().each 以及 $.each的区别
    数组中的forEach和map的区别
  • 原文地址:https://www.cnblogs.com/liuligang/p/10576538.html
Copyright © 2011-2022 走看看