码迷,mamicode.com
首页 > 其他好文 > 详细

观察者模式(Observer)

时间:2015-08-26 22:10:57      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:

观察者模式是对象的行为模式,又叫做发布-订阅模式、源-监听器模式或者从属者模式。

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

下面给出一个简单的示意性系统,在该系统中有如下几个角色:

  • 抽象主题(Subject)角色:主题角色把所有对观察者对象引用保存在一个聚集(比如Vector对象)里,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象,主题角色又叫做抽象被观察者角色,一般用一个抽象类或者一个接口实现。
  • 抽象观察者角色(Observer):为所有的具体观察者定义一个接口,在得到主题的通知时更新自己。这个接口叫做更新接口。抽象观察者角色一般用一个抽象类或者一个接口实现。
  • 具体主题(ConcreteSubject)角色,将有关状态存入具体观察者对象,在具体主题内部状态改变时,给所有登记过的观察者发出通知。具体主题角色又叫作具体被观察者角色。
  • 具体观察者(ConcreteObserver)角色:存储与主题的相关的状态。具体观察者角色实现抽象者角色所要求的更新接口
/**
 * 抽象被观察者角色,抽象主题角色
 */
public interface Subject
{
    /*
    * 调用这个方法登记一个新的观察者对象
    * */
    public void attach(Observer observer);
    /*
    * 调用这个方法删除一个已经登记过的观察者对象
    * */
    public void detach(Observer observer);
    /*
    * 调用这个方法通知所有登记过的观察者对象
    * */
    void notifyObservers();
   }

 

/**
 * 具体主题角色,具体被观察者角色
 */
public class ConcreteSubject implements Subject
{
    private Vector observersVector=new Vector();
    /*
    * 调用这个方法登记一个新的观察者对象
    * */
    @Override
    public void attach(Observer observer)
    {
        observersVector.addElement(observer);
    }
    /*
        * 调用这个方法删除一个登记过的观察者对象
        * */
    @Override
    public void detach(Observer observer)
    {
        observersVector.removeElement(observer);
    }
    /*
    * 调用这个方法通知所有登记过的观察者对象
    * */
    @Override
    public void notifyObservers()
    {
        Enumeration enumeration=observers();
        while(enumeration.hasMoreElements())
        {
            Observer observer=(Observer)enumeration.nextElement();
            observer.update();
        }

    }
    /*
    * 这个方法给出观察者聚集的Enumeration对象
    * */
    public Enumeration observers()
    {
        return ((Vector)observersVector.clone()).elements();
    }
 }

 

/**
 * 抽象观察者角色
 */
public interface Observer
{
    /*
    * 调用这个方法会更新自己
    * */
    void update();
 }

 

/**
 * 具体观察者
 */
public class ConcreteObserver implements Observer
{
    /*
    * 调用这个方法会更新自己
    * */
    private String observerName;
    public ConcreteObserver(String name)
    {
        this.observerName=name;
    }
    public String getObserverName()
    {
        return observerName;
    }
     @Override
    public void update()
    {
        System.out.println(observerName+" I am notified");
    }
}

 另外一种实现:

/**
 * 抽象主题角色
 */
public abstract class Subject
{
    private Vector observersVector=new 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()
    {
        Enumeration enumeration=observers();
        while(enumeration.hasMoreElements())
        {
            Observer observer=(Observer)enumeration.nextElement();
            observer.update();
        }
    }
    /*
    * 这个方法给出观察者聚集的Enumeration对象
    * */
    public Enumeration observers() {
        return ((Vector) observersVector.clone()).elements();
    }
}

/**
 * 具体主题角色
 */
public class ConcreteSubject extends Subject
{
    private String state;
    /*
    * 调用这个方法更改主题的状态
    * */
    public void change(String newState)
    {
        this.state=newState;
        System.out.println("状态改变");
        this.notifyObservers();;
    }
 }

/**
 * 抽象观察者角色
 */
public interface Observer
{
    /*
    * 调用这个方法会更新自己
    * */
    void update();
 }

/**
 * 具体观察者
 */
public class ConcreteObserver implements Observer
{
    /*
    * 调用这个方法会更新自己
    * */
    private String observerName;
    public ConcreteObserver(String name)
    {
        this.observerName=name;
    }
    public String getObserverName()
    {
        return observerName;
    }
     @Override
    public void update()
    {
        System.out.println(observerName+" I am notified");
    }
}


public class Client
{
    public static void main(String[] args) {
        ConcreteObserver concreteObserver1=new ConcreteObserver("observer1");
        ConcreteObserver concreteObserver2=new ConcreteObserver("observer2");
        ConcreteObserver concreteObserver3=new ConcreteObserver("observer3");
        ConcreteSubject subject=new ConcreteSubject();
        subject.attach(concreteObserver1);
        subject.attach(concreteObserver2);
        subject.attach(concreteObserver3);
        subject.change("new_state");

    }

}

 

观察者模式(Observer)

标签:

原文地址:http://www.cnblogs.com/xtsylc/p/4761528.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!