• 设计模式之观察者模式-以jdk实现为例


    一、jdk观察者模式实现代码分析:

    1、Observable-被观察者(主题)

    package java.util;
    
    public class Observable {
        private boolean changed = false;
        private Vector<Observer> obs;
    
    
      //无参的构造函数
        public Observable() {
        //初始化一个观察者的集合
            obs = new Vector<>();
        }
    
        //向主题或者被观察者中添加观察者
        public synchronized void addObserver(Observer o) {
            if (o == null)
                throw new NullPointerException();
            if (!obs.contains(o)) {
                obs.addElement(o);
            }
        }
    
        //删除某个观察者
        public synchronized void deleteObserver(Observer o) {
            obs.removeElement(o);
        }
    
        //通知所有注册的观察者更新
        public void notifyObservers() {
            notifyObservers(null);
        }
    
        public void notifyObservers(Object arg) {
            
            Object[] arrLocal;
    
            synchronized (this) {
              //如果未调用setChanged,将不会通知所有观察者更新
                if (!changed)
                    return;
           //若调用了setChanged,则通知所有观察者更新
                arrLocal = obs.toArray();
                clearChanged();
            }
    
            for (int i = arrLocal.length-1; i>=0; i--)
                ((Observer)arrLocal[i]).update(this, arg);
        }
    
        //删除所有观察者
        public synchronized void deleteObservers() {
            obs.removeAllElements();
        }
    
        //设置更新标记
        protected synchronized void setChanged() {
            changed = true;
        }
    
        //清除更新标记
        protected synchronized void clearChanged() {
            changed = false;
        }
    
        //获取是否发生了更新
        public synchronized boolean hasChanged() {
            return changed;
        }
    
        //获取观察者的数量
        public synchronized int countObservers() {
            return obs.size();
        }
    }
      
    

      2、Observer-观察者接口

    package java.util;
    
    
    public interface Observer {
        //观察者更新方法 
        void update(Observable o, Object arg);
    }
    

    二、应用jdk观察者模式实现的案例:

    1、被观察者(主题)

    import java.util.Observable;
    
    public class ConcreteObservable extends Observable {
    
    	public void dataChanged(String msg) {
    		setChanged();
    		notifyObservers(msg);
    	}
    
    }
    

    2、两个观察者

    import java.util.Observable;
    import java.util.Observer;
    
    public class ObserverA implements Observer{
    
    	@Override
    	public void update(Observable o, Object arg) {
    		System.out.println("ObserverA"+arg);
    		
    	}
    
    }
    

      

    import java.util.Observable;
    import java.util.Observer;
    
    public class ObserverB implements Observer{
    
    	@Override
    	public void update(Observable o, Object arg) {
    		System.out.println("ObserverB"+arg);
    		
    	}
    
    }
    

    3、测试类

    public class ObserverDemo {
    
    	public static void main(String[] args) {
    
    		// 添加第一个观察者
    		ObserverA observerA = new ObserverA();
    		ConcreteObservable observable = new ConcreteObservable();
    		observable.addObserver(observerA);
    		observable.dataChanged("第一次发生变化");
    		System.out.println("观察者数量" + observable.countObservers());
    
    		// 添加第二个观察者
    		ObserverB observerB = new ObserverB();
    		observable.addObserver(observerB);
    		observable.dataChanged("第二次发生变化");
    		System.out.println("观察者数量" + observable.countObservers());
    
    	}
    
    }
    

    4、执行结果如下:

    ObserverA第一次发生变化
    观察者数量1
    ObserverB第二次发生变化
    ObserverA第二次发生变化
    观察者数量2

  • 相关阅读:
    转载 | float 清除浮动的7种方法
    转载 | CSS图片下面产生间隙的 6种解决方案
    (转载)内联元素设置宽高问题
    HTML/CSS:display:flex 布局教程
    HTML/CSS:block,inline和inline-block概念和区别
    上传文件
    分页查询 模糊查询 合体查询
    repeater的command用法
    窗体内的控制 跨窗体控制
    webform 跨窗体传值
  • 原文地址:https://www.cnblogs.com/silenceshining/p/10480258.html
Copyright © 2020-2023  润新知