观察者模式(Observer)
角色:
抽象主题角色:将所有观察者对象的引用保存在一个集合中,每个主题可以有任意数量的观察者。抽象主题角色提供一个接口,可以增加和删除任意数据的观察者。
抽象观察者角色:为所有观察者定义一个接口,在得到主题时更新自已。
具体主题角色:将有关状态存入具体观察者对象,在具体主题的内部状态改变时,给所有登记的观察者发出通知。
具体观察者角色:存储与主题的状态自恰的状态。
类图:
主要特点:
观察者模式定义了一种 一对多的依赖关系,让多个观察者对象同时监听一个主题对象,这个主题对象在状态发生变化时,通知所有观察者对象,让其能够自动更新自己。
下面是我写的一个简单例子:
抽象主题角色:
package com.design.observer;
public interface Subject
{
public void attach(Observer observer);
public void detach(Observer observer);
public void notifyObservers();
}
具体主题角色:
package com.design.observer;
import java.util.Enumeration;
import java.util.Vector;
public class ConcreteSubject implements Subject
{
private Vector<Observer> vector = new Vector<Observer>();
@Override
public void attach(Observer observer)
{
vector.addElement(observer);
}
@Override
public void detach(Observer observer)
{
vector.removeElement(observer);
}
@Override
public void notifyObservers()
{
Enumeration<Observer> enumeration = observers();
while(enumeration.hasMoreElements())
{
enumeration.nextElement().update();
}
}
@SuppressWarnings("unchecked")
private Enumeration<Observer> observers()
{
return ((Vector<Observer>)vector.clone()).elements();
}
}
抽象观察者角色:
package com.design.observer;
public interface Observer
{
public void update();
}
两个具体观察者角色:
package com.design.observer;
public class ObserverA implements Observer
{
@Override
public void update()
{
System.out.println("I am A");
}
}
package com.design.observer;
public class ObserverB implements Observer
{
@Override
public void update()
{
System.out.println("I am B");
}
}
测试类:
package com.design.observer;
public class Client
{
public static void main(String[] args)
{
Subject subject = new ConcreteSubject();
ObserverA a = new ObserverA();
ObserverB b = new ObserverB();
subject.attach(a);
subject.attach(b);
subject.notifyObservers();
subject.detach(a);
subject.notifyObservers();
}
}
结果:
I am A
I am B
I am B
说到观察者的应用,比较典型就是AWT的DEM(委派事件模型Delegation Event Mode),1.1版本的AWT就是使用了观察者模式。