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

    观察者模式

    意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

    解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。

    使用:一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。

    关键:在抽象类里有一个 ArrayList 存放观察者们。

     

    优点: 1、观察者和被观察者是抽象耦合的。

        2、建立一套触发机制。

    缺点: 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。

                2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。

                3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

    代码示例:

    1、定义观察者抽象类

    /**
     * 观察者模式
     * @author 943567518@qq.com
     *
     */
    public abstract class Observer {
    
        public abstract void update(String msg);
    }

    2、定义多个观察者

    public class Observer1 extends Observer{
    
        @Override
        public void update(String msg) {
            // TODO Auto-generated method stub
            System.out.println(Observer1.class+":"+msg);
        }
    
    }
    public class Observer2 extends Observer{
    
        @Override
        public void update(String msg) {
            // TODO Auto-generated method stub
            System.out.println(Observer2.class+":"+msg);
        }
    
    }
    public class Observer3 extends Observer{
    
        @Override
        public void update(String msg) {
            // TODO Auto-generated method stub
            System.out.println(Observer3.class+":"+msg);
        }
    
    }

    3、定义被观察者

    import java.util.ArrayList;
    import java.util.List;
    /**
     * 观察者模式-被观察者
     * @author 943567518@qq.com
     *
     */
    public class Subject {
        
        private List<Observer> obs=new ArrayList<Observer>();
        
        public void add(Observer ob){
            obs.add(ob);
        }
        
        public void setMsg(String msg){
            for(Observer ob:obs){
                ob.update(msg);
            }
        }
        
        public static void main(String[] args) {
            Observer1 o1=new Observer1();
            Observer2 o2=new Observer2();
            Observer3 o3=new Observer3();
            Subject s=new Subject();
            s.add(o1);
            s.add(o2);
            s.add(o3);
            s.setMsg("信息");
            s.setMsg("改变");
        }
    }
  • 相关阅读:
    #莫比乌斯函数,Miller-Rabin#洛谷 3653 小清新数学题
    #Dijkstra,二进制拆位#洛谷 5304 [GXOI/GZOI2019]旅行者
    #dp#洛谷 4158 [SCOI2009]粉刷匠
    #李超线段树,树链剖分#洛谷 4069 [SDOI2016]游戏
    #线段树合并#洛谷 3224 [HNOI2012]永无乡
    #主席树,dsu on tree,树上倍增#洛谷 3302 [SDOI2013]森林
    #树状数组,CDQ分治#洛谷 4390 [BOI2007]Mokia 摩基亚
    #单调队列#JZOJ 1753 锻炼身体
    #约数#洛谷 4296 [AHOI2007]密码箱
    #队列#洛谷 6033 合并果子 加强版
  • 原文地址:https://www.cnblogs.com/xmqa/p/8631372.html
Copyright © 2011-2022 走看看