观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。
面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了
应用程序的可维护性和重用性。
观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的独享都得到通知并自动刷新。
package mode.observer.final_;
/**
*
* 创建被观察者的接口,规定要实现的方法
*
* */
public interface Subject {
/* 增加观察者 */
public void add(Observer observer);
/* 删除观察者 */
public void del(Observer observer);
/* 通知所有的观察者 */
public void notifyObservers();
/* 自己的操作 */
public void operation();
}
package mode.observer.final_;
import java.util.Enumeration;
import java.util.Vector;
/**
*
* 实现一个抽象的被观察者,用来实现那些所有的被观察者所共有的方法,属性
*
* */
public abstract class AbstractSubject implements Subject {
private Vector<Observer> vector = new Vector<Observer>();
@Override
public void add(Observer observer) {
vector.add(observer);
}
@Override
public void del(Observer observer) {
vector.remove(observer);
}
@Override
public void notifyObservers() {
Enumeration<Observer> enumo = vector.elements();
while (enumo.hasMoreElements()) {
enumo.nextElement().update();
}
}
}
package mode.observer.final_;
public class MySubject extends AbstractSubject {
@Override
public void operation() {
System.out.println("update self");
//完成操作后要主动去通知观察者
notifyObservers();
}
}
package mode.observer.final_;
/*观察者接口,规定所有观察者都要实现update方法*/
public interface Observer {
public void update();
}
两个具体的观察者
package mode.observer.final_;
public class Observer1 implements Observer {
@Override
public void update() {
System.out.println("Observer1 has received the message !");
}
}
package mode.observer.final_;
public class Observer2 implements Observer {
@Override
public void update() {
System.out.println("Observer2 has received the message !");
}
}
测试
package mode.observer.final_;
public class Test {
public static void main(String[] args) {
Subject sub = new MySubject();
sub.add(new Observer1());
sub.add(new Observer2());
sub.operation();
}
}