设计模式之--观察者模式(二)

2014-11-24 07:26:00 · 作者: · 浏览: 1
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.toUpperCase()); } public void leave() { this.display("I remove myself from the ObserverList..."); subject.removeObserver(this); } }
---------------------------- 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的类才能调用该方法。