概述
观察者模式也被称为发布/订阅模式。
GoF说道:Observer模式的意图是“定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新”。从这段话里我们可以得到两个信息,如下:
1, 观察者(具体执行操作的对象,有多个) ,被主题回调。2, 被观察者(顾名思义是被观察的对象,也可以说是主题,如果该对象发生某些变化则通知观察者执行对应的操作,一般为更新自己)
包含角色
抽象主题:
具体主题:
抽象观察者:
具体观察者:
具体实例
抽象主题:
public interface Subject {
// add observer
public void add(Observer observer);
// delete observer
public void delete(Observer observer);
// notify all
public void notifyAllObservers();
// 模拟主题状态的改变
public void operation();
}
抽象观察者:
public interface Observer {
public void update();
}
具体主题:
import java.util.Vector;
public class MainSubject implements Subject{
private Vector<Observer> vector = new Vector<Observer>();
@Override
public void add(Observer observer) {
// TODO Auto-generated method stub
vector.add(observer);
}
@Override
public void delete(Observer observer) {
// TODO Auto-generated method stub
vector.remove(observer);
}
@Override
public void notifyAllObservers() {
// TODO Auto-generated method stub
for (Observer o : vector) {
o.update();
}
}
@Override
public void operation() {
System.out.println("update self.");
notifyAllObservers();
}
public static void main(String args[]) {
MainSubject mm = new MainSubject();
mm.add(new ConcreteObserver1());
mm.add(new ConcreteObserver2());
mm.operation();
}
}
具体观察者:
public class ConcreteObserver2 implements Observer{
@Override
public void update() {
// TODO Auto-generated method stub
System.out.println("observer2 has received.");
}
}
public class ConcreteObserver1 implements Observer{
@Override
public void update() {
// TODO Auto-generated method stub
System.out.println("observer 1 has received.");
}
}
update self.
observer 1 has received.
observer2 has received.