---------------------------- LowerOutputer.java
package cn.ac.ict.chengenbao;
public class LowerOutputer implements Observer {
private Subject subject = null;
public LowerOutputer(Subject s) {
subject = s;
s.registerObserver(this);
}
public void update(String message) {
// TODO Auto-generated method stub
this.display(message);
}
private void display(String message) {
System.out.println(this.getClass().getName() + ":" + message.toLowerCase());
}
public void leave() {
this.display("I remove myself from the ObserverList...");
subject.removeObserver(this);
}
}
------------------------ Test.java
package cn.ac.ict.chengenbao;
public class Test {
public static void main(String[] args) {
SubjectImpl subject = new SubjectImpl();
LowerOutputer lowerOuter = new LowerOutputer(subject);
UpperOutputer upperOuter = new UpperOutputer(subject);
OriginOutputer originOuter = new OriginOutputer(subject);
subject.changeMessage("Message1");
originOuter.leave();
subject.changeMessage("Message2");
lowerOuter.leave();
subject.changeMessage("Message3");
upperOuter.leave();
subject.changeMessage("Message4");
}
}
运行结果:

4. JDK API 对观察者模式的支持
JDK API 中提供了对观察者模式的原生支持。在 java.util 包中,包含Observer接口和Observable类,开发者可以通过实现Observer接口和继承Observable类来实现观察者模式。
使用JAVA自带的观察者模式会受到以下限制:
1) java.util.Observable是个类而不是接口,这使得要实现的Subject类不能继承其他的类,从而使得一些原有的类不能迁移至观察者模式。同时,通过继承实现Subject模式也违背了我们“Program to the interface”的一贯原则。
2)Observable实现中对一些关键的方法进行了访问保护,比如说setChanged方法,只有继承自Observable的类才能调用该方法。