美文网首页代码笔记程序员
Java内置接口的观察者模式

Java内置接口的观察者模式

作者: _VITA | 来源:发表于2018-04-05 12:55 被阅读8次

    特点:线程安全

    • 观察者,接口提供被调用的方法
    public interface Observer {//
    }
    
    • 被观察者,调用观察者的方法.观察者集合用Vector而不是Arraylist,Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。这么做是为了防止同时增添observer的时候,调用observer的方法。
      还可以用CopyOnWriteArraylist(线程安全的Arraylist);
    public class Observable {
        private boolean changed = false;
        private Vector<Observer> obs = new Vector();
    
        public Observable() {
        }
    
        public synchronized void addObserver(Observer var1) {
            if(var1 == null) {
                throw new NullPointerException();
            } else {
                if(!this.obs.contains(var1)) {
                    this.obs.addElement(var1);
                }
    
            }
        }
    
        public synchronized void deleteObserver(Observer var1) {
            this.obs.removeElement(var1);
        }
    
        public void notifyObservers() {
            this.notifyObservers((Object)null);
        }
    
        public void notifyObservers(Object var1) {
            Object[] var2;
            synchronized(this) {
                if(!this.changed) {
                    return;
                }
    
                var2 = this.obs.toArray();
                this.clearChanged();
            }
    
            for(int var3 = var2.length - 1; var3 >= 0; --var3) {
                ((Observer)var2[var3]).update(this, var1);
            }
    
        }
    
        public synchronized void deleteObservers() {
            this.obs.removeAllElements();
        }
    
        protected synchronized void setChanged() {
            this.changed = true;
        }
    
        protected synchronized void clearChanged() {
            this.changed = false;
        }
    
        public synchronized boolean hasChanged() {
            return this.changed;
        }
    
        public synchronized int countObservers() {
            return this.obs.size();
        }
    }
    

    引申一下 线程安全的集合还有 ConcurrentHashMap。


    image.png

    相关文章

      网友评论

      • IT人故事会:老铁下次注意格式啊,不太清晰,给点建议对于新手需要的是注释啊

      本文标题:Java内置接口的观察者模式

      本文链接:https://www.haomeiwen.com/subject/vgmrhftx.html