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

      

      定义

      观察者模式:定义了一种对象间的一对多依赖关系,一旦被依赖对象改变状态,所有观察者都会得到通知并自动更新

      实例

      我们在日常生活中,微信公众号的运作模式便是典型的观察者模式的实现,一旦公众号新推了内容,所有关注公众号的账号都会得到通知。

      优缺点

      观察者模式的优点是可以实现表示层与数据逻辑层的分离,可以在观察者与被观察者之间建立一个抽象的耦合,支持广播通信。

      缺点是如果一个观察者的被观察者太多的话,通知动作会花费大量的时间。而且如果观察者与被观察者之间存在循环依赖的话,观察目标可能会触发它们的循环调用,造成系统崩溃。

      类图

       被观察者维护着一个观察者的集合,在有事件时循环通知集合中的观察者。

      被观察者抽象规定了被观察者的行为,必须包括:新增观察者、删除观察者、通知观察者。

      观察者抽象规定了观察者的行为,必须包括:接收通知。

      示例

      观察者抽象:

    /**
    *   @Author Nyr
    *   @Date 2019/11/26 19:21
    *   @Description 观察者抽象
    */
    public interface Obsever {
        /**
        *   @Author Nxy
        *   @Date 2019/11/26 19:21
        *   @Param msg:通知消息
        *   @Return
        *   @Exception
        *   @Description 接收观察者通知的方法
        */
        public void update(String msg);
    }

      被观察者抽象:

    /**
     * @Author Nyr
     * @Date 2019/11/26 19:23
     * @Description 被观察者抽象
     */
    public interface Subject {
        /**
         * @Author Nxy
         * @Date 2019/11/26 19:24
         * @Param o:观察者对象
         * @Return
         * @Exception
         * @Description 新增观察者对象
         */
        public void addObserver(Obsever o);
    
        /**
         * @Author Nxy
         * @Date 2019/11/26 19:25
         * @Param o:观察者对象
         * @Return
         * @Exception
         * @Description 删除观察者对象
         */
        public void removeObserver(Obsever o);
    
        /**
         * @Author Nxy
         * @Date 2019/11/26 19:26
         * @Param msg:通知信息
         * @Return
         * @Exception
         * @Description 通知所有观察者
         */
        public void notifyObservers(String msg);
    }

      被观察者实例:

    public class ConcreteSubject implements Subject {
        //观察者集合
        private List<Obsever> obsevers=new LinkedList<>();
        /**
         * @Author Nxy
         * @Date 2019/11/26 19:24
         * @Param o:观察者对象
         * @Return
         * @Exception
         * @Description 新增观察者对象
         */
        @Override
        public void addObserver(Obsever o){
            obsevers.add(o);
        }
    
        /**
         * @Author Nxy
         * @Date 2019/11/26 19:25
         * @Param o:观察者对象
         * @Return
         * @Exception
         * @Description 删除观察者对象
         */
        @Override
        public void removeObserver(Obsever o){
            obsevers.remove(o);
        }
    
        /**
         * @Author Nxy
         * @Date 2019/11/26 19:26
         * @Param msg:通知信息
         * @Return
         * @Exception
         * @Description 通知所有观察者
         */
        @Override
        public void notifyObservers(String msg){
            for(Obsever o:obsevers){
                o.update(msg);
            }
        }
    }

      观察者实例:

    public class ConcreteObserver implements Obsever {
        @Override
        public void update(String msg){
            System.out.println("消费者  "+this.hashCode()+"  收到通知:  "+msg);
        }
    }

      Demo

    public class Demo {
        public static void main(String[] args) {
            Subject s = new ConcreteSubject();
            Obsever o0 = new ConcreteObserver();
            Obsever o1 = new ConcreteObserver();
            Obsever o2 = new ConcreteObserver();
            Obsever o3 = new ConcreteObserver();
            Obsever o4 = new ConcreteObserver();
            Obsever o5 = new ConcreteObserver();
            //注册观察者
            s.addObserver(o0);
            s.addObserver(o1);
            s.addObserver(o2);
            s.addObserver(o3);
            s.addObserver(o4);
            s.addObserver(o5);
            //通知所有观察者
            s.notifyObservers("通知1");
        }
    }

      六个观察者都收到了通知:

  • 相关阅读:
    MD5,SHA1,SHA256,SHA512等常用加密算法
    Encoding.GetEncoding 编码列表
    Form开发小技巧
    全国分河流水系流域边界及河流数据水系及主要流域分界图
    建筑物轮廓自然保护区城市AOI水土保持水资源水文建成区生态功能分区矢量数据shptabdwgcdr
    坐标转换一些
    mysql 查询语言使用 lisoaring
    lisoaring python 字符串 编码
    全国各省乡镇街道边界行政区划矢量地图shpmapinfocad最新20101112131415 161718
    写第一篇 随笔
  • 原文地址:https://www.cnblogs.com/niuyourou/p/11937940.html
Copyright © 2011-2022 走看看