`
hanlingbo2008
  • 浏览: 80469 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

观察者模式(Observer)

阅读更多

12、观察者模式(Observer)

   

       定义: 观察者模式定义了一种一对多的依赖关系,让多个观察者同时监听某一个主题对象。这个主题对象发生变化时,会通知所有观察者对象,使他们都能够自动更新自己。

 

 

      角色定义:

 

  • 抽象主题角色(Subject): 主题角色又叫做抽象被观察者(Oberservable),  抽象被观察者角色把所有的对观察者对象的引用保存在一个聚集里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口可以增加和删除观察者对象。
  • 抽象观察者角色(Observer): 为所有的具体观察者定义一个接口,在得到主题的通知时更新自己。这个接口叫更新接口。抽象观察者角色一般用一个接口和抽象类实现。
  • 具体主题角色(Concrete Subject) : 将有关状态存入观察者对象;在具体主题内部发生变化时,给所有的登记过的观察者发出通知。
  • 具体观察者(ConcreteObserver): 存储与主题的状态自恰的状态。具体观察者角色实现抽象观察者角色所要求的接口,以便使自己的状态 和主题的状态相协调。

 

     实例代码:

public interface Subject{
	  //登记一个观察者对象
    public void attach(Observer observer);
    //注销一个观察者对象
    public void detach(Observer observer);
    //通知所有登记过的观察者对象
    void notifyObservers();
}

 

import java.util.Vector;
import java.util.Enumeration;

public class ConcreteSubject implements Subject
{
		//用于保存具体的观察者
    private Vector observersVector = new java.util.Vector();
    //登记观察者
    public void attach(Observer observer){
        observersVector.addElement(observer);
    }
		//注销观察者
    public void detach(Observer observer){
        observersVector.removeElement(observer);
    }
		//通知所有已经登记的观察者
    public void notifyObservers(){
		Enumeration enumeration = observers();
		while (enumeration.hasMoreElements()){
			((Observer)enumeration.nextElement()).update();
		}
	}
		//给出观察者聚集的Enumeration对象
    public Enumeration observers(){
        return ((Vector) observersVector.clone()).elements();
    }

}

 

public interface Observer
{
    void update();
}

 

public class ConcreteObserver implements Observer{
    public void update()
    {
        // Write your code here
    }
}

 另一种实现方法,实例代码2

import java.util.Vector;
import java.util.Enumeration;

abstract public class Subject 
{

    /**
     * 将观察者引用集合放入抽象主题对象
     */
    private Vector observersVector = new java.util.Vector();

    public void attach(Observer observer)
    {
        observersVector.addElement(observer);
        System.out.println("Attached an observer.");
    }

    public void detach(Observer observer)
    {
        observersVector.removeElement(observer);
    }

    public void notifyObservers()
    {
		java.util.Enumeration enumeration = observers();
		while (enumeration.hasMoreElements())
        {
            System.out.println("Before notifying");
			((Observer)enumeration.nextElement()).update();
		}
	}

    public Enumeration observers()
    {
        return ((java.util.Vector) observersVector.clone()).elements();
    }

}

 

public class ConcreteSubject extends Subject{
    private String state;

    public void change(String newState){
        state = newState;
        this.notifyObservers();
    }
}

 

public interface Observer{
    void update();
}

 

public class ConcreteObserver implements Observer{
    public void update(){
        System.out.println("I am notified");
    }
}

 

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("new state");

    }
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics