观察者模式(Observer)

观察者模式,定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。例如,邮件订阅和RSS订阅,当你订阅了改文章,如果有后续更新,会及时通知你。关系图如下:

我解释下这些类的作用:MySubject类就是我们的主题,Observer1和Observer2是依赖于MySubject的对象,当MySubject变化时,Observer1和Observer2必然变化。AbstractSubject类是主题的基类,定义了主题通用方法。

主题接口:

public interface ISubject {
    
    /** 增加观察者 */
    public void add(IObserver observer);
    
    /** 删除观察者 */
    public void del(IObserver observer);
    
    /** 通知所有观察者 */
    public void notifyObservers();
    
    /** 自身操作 */
    public void operation();
}

主题基类:

public abstract class AbsSubject implements ISubject{
    
    private Vector<IObserver> observers = new Vector<IObserver>();
    
    @Override
    public void add(IObserver observer) {
        observers.add(observer);
    }
    
    @Override
    public void del(IObserver observer) {
        observers.remove(observer);
    }

    @Override
    public void notifyObservers() {
        Enumeration<IObserver> enumo = observers.elements();  
        while(enumo.hasMoreElements()){  
            enumo.nextElement().update();  
        }  
    }
}

我的主题:

public class MySubject extends AbsSubject{

    @Override
    public void operation() {
        System.out.println("有新通知!");
        notifyObservers();
    }

}

观察者接口:

public interface IObserver {
    public void update();
}

两个观察者:

public class Observer1 implements IObserver{

    @Override
    public void update() {
        System.out.println(getClass().getSimpleName() + "收到通知了!");
    }

}
public class Observer2 implements IObserver{

    @Override
    public void update() {
        System.out.println(getClass().getSimpleName() + "收到通知了!");
    }

}

测试:

public class Test {

    public static void main(String[] args) {
        MySubject subject = new MySubject();
        subject.add(new Observer1());
        subject.add(new Observer2());
        
        subject.operation();
    }

}

输入结果:

有新通知!
Observer1收到通知了!
Observer2收到通知了!

 

 

改编于,如需看原文请点击:http://blog.csdn.net/zhangerqing/article/details/8194653

posted @ 2015-07-08 11:20  蜉蝣朝生而暮死  阅读(178)  评论(0编辑  收藏  举报