观察者模式
观察者模式是一种常见的设计模式,当一个对象的行为依赖另一个对象的状态时,观察者模式就显得非常有用。观察者模式可以使用单线程,是某一个对象,及时得知自身所依赖者的状态的变化。
经典的观察者模式的一般实现如下:
1.主题接口:
package com.zendly.mode.observer;
/**
* 观察者主题接口
* @author zendly
*/
public interface ISubject {
void attach(IObserver o);//添加观察者
void detach(IObserver o);//删除观察者
void inform();//通知所有观察者
}
2.观察者接口:
package com.zendly.mode.observer;
import java.awt.Event;
/**
* 观察者接口,核心逻辑处理方法
* @author zendly
*/
public interface IObserver {
void update(Event event);
}
3.主题接口的实现:
package com.zendly.mode.observer;
import java.awt.Event;
import java.util.Vector;
/**
* 具体的主题接口的实现
* 这里我们通常使用一个Vector来维护观察者堆列
* @author zendly
*/
public class DetailSubject implements ISubject{
Vector<IObserver> os = new Vector<IObserver>();
@Override
public void attach(IObserver o) {
os.addElement(o);
}
@Override
public void detach(IObserver o) {
os.removeElement(o);
}
@Override
public void inform() {
Event e = new Event(new Object(), 1, new Object());
/*这里通知所有观察者*/
for (IObserver o : os) {
o.update(e);
}
}
}
4.具体观察者实现观察者接口:
package com.zendly.mode.observer;
import java.awt.Event;
/**
* 具体观察者的实现,这里在接收到依赖对象的通知的时候,
* 去执行实际要处理的逻辑
* @author zendly
*/
public class DetailObserver implements IObserver{
@Override
public void update(Event event) {
System.out.println("if received msg ,do it");
}
}
由于观察者模式是如此的常见和实用,故JDK内部已经为开发者准备一套观察者模式对象,包括:java.util.Observable类和java.util.Observer接口,开发者可以实现它们完成自己的观察者模式的逻辑。