观察者模式是对象的行为模式,又叫做发布-订阅模式、源-监听器模式或者从属者模式。
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听同一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。
下面给出一个简单的示意性系统,在该系统中有如下几个角色:
/**
* 抽象被观察者角色,抽象主题角色
*/
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");
}
}
原文:http://www.cnblogs.com/xtsylc/p/4761528.html