观察者(Observer)模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。
适用性:
  • 当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
  • 当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。
  • 当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。

    Observer.bmp
    《Java与模式》中提到了两种结构,上图属于第二种,Java中内置的Observable也属于这种。
    一个简单的例子:
    Subject抽象类:

    package Observer;
    import java.util.Vector;
    import java.util.Enumeration;

    public abstract class Subject{
        
        
    //聚集保存了对所有观察者对象的引用
        private Vector obsVector =new Vector();
        
    //登记一个新的观察者对象
        public void attach(Observer obs){
            obsVector.add(obs);
        }

        
    //删除一个已经登记过的观察者的对象
        public void detach(Observer obs){
            obsVector.remove(obs);
        }

        
    //通知所有已经登记过的观察者对象
        public void notifyObservers(){
            Enumeration en
    =observers();
            
            
    while(en.hasMoreElements()){
                ((Observer)en.nextElement()).update();
            }
        
        }

        
    //返回观察者聚集的Enumeration对象
        public Enumeration observers(){
            
    return obsVector.elements();
        }

        
    }

    具体Subject类
    package Observer;
    public class ConcreteSubject extends Subject{
        
    //改变状态
        public void change(){
            
    this.notifyObservers();
        }

    }
    Observer类
    package Observer;
    public interface Observer{
        
    //更新自己
        public void update();
    }
    ConcreteObserver类
    package Observer;

    public class ConcreteObserver implements Observer{
        
    //调用此方法更新自己
        public void update(){
            System.out.println(
    "I am nofitied");
        }

    }
    Client类
    package Observer;

    public class Client{
        
        
    private static ConcreteSubject subject;
        
    private static Observer observer;
        
        
    public static void main(String[] args){
            
    //创建主题对象
            subject=new ConcreteSubject();
            
    //创建观察者对象
            observer=new ConcreteObserver();
            
    //登记观察者对象
            subject.attach(observer);
            
    //改变状态
            subject.change();
        }

    }

    在JDK提供对观察者模式的支持,利用java.util.Observable和java.util.Observer构造一个观察者模式,在这里就不把一个示例代码贴出来。

    参考资料:《设计模式速查手册》
                         《Java与模式》