观察者模式(observer)
概念:
当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化!对象之间是一种一对多的关系。
适用:
1.当一个对象有两个方面,其中一个方面依赖于另一个方面。将二者封装在独立的对象中以使他们可以各自独立的改变和复用。
2.当一个对象的改变需要同时改变其他对象,而不知道具体有多少对象有待改变。
3.当一个对象必须通知其他对象,而又不能假定其他对象是谁。
代码示例:
/**
* 观察者接口
* 在得到通知时更新自己
*/
public interface Observer {
public void update();
}
/**
* 观察者1
*/
public class Observer1 implements Observer {
public void update() {
System.out.println("observer1 has received!");
}
}
/**
* 观察者2
*/
public class Observer2 implements Observer {
public void update() {
System.out.println("observer2 has received!");
}
}
public interface Subject {
/*增加观察者*/
public void add(Observer observer);
/*删除观察者*/
public void del(Observer observer);
/*通知所有的观察者*/
public void notifyObservers();
/*自身的操作*/
public void operation();
}
/**
* 把所有对象观察者对象的引用保存在一个集合中,可以增加或删除观察者对象
*/
public abstract class AbstractSubject implements Subject {
private Vector<Observer> vector = new Vector<Observer>();
public void add(Observer observer) {
vector.add(observer);
}
public void del(Observer observer) {
vector.remove(observer);
}
public void notifyObservers() {
Enumeration<Observer> enumo = vector.elements();
while(enumo.hasMoreElements()){
enumo.nextElement().update();
}
}
}
/**
* 主对象(被观察的对象)
* 将有关状态存入具体观察者对象,当该对象改变时,给所有登记过的观察者发出通知
*/
public class MySubject extends AbstractSubject {
public void operation() {
System.out.println("update self!");
notifyObservers();
}
}
/**
* 观察者模式的测试
* 当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化
*/
public class Test {
public static void main(String[] args) {
Subject sub = new MySubject();
sub.add(new Observer1());
sub.add(new Observer2());
sub.operation();
}
}