• 观察者模式


      

      定义

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

      实例

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

      优缺点

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

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

      类图

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

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

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

      示例

      观察者抽象:

    /**
    *   @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");
        }
    }

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

  • 相关阅读:
    [Bada开发]基于bada1.0的5种控件介绍[待续]
    [Bada开发]API官方学习2-风格
    [Bada开发]HelloWorld篇
    [Bada开发]初步入口函数介绍
    [Bada开发]使用共享库
    [Bada开发]使用静态库
    [Bada开发]OpenGL ES 2.0程序 创建简单3D图形
    [Bada开发]播放实时rtsp流
    剑指offer-删除链表中重复的结点
    剑指offer-构建乘积数组
  • 原文地址:https://www.cnblogs.com/niuyourou/p/11937940.html
Copyright © 2020-2023  润新知