观察者模式也叫做发布订阅模式,定义对象间一对多的依懒关系,使得每当一个对象状态改变,所有依懒于它的对象都会得到通知并被自动更新。
关键代码:在抽象类里有一个 ArrayList 存放观察者们。
示例代码:
/**
* 被观察者抽象类
*/
public abstract class Subject {
// 观察者列表,vector是线程安全的
private Vector<Observer> observerVector = new Vector<Observer>();
// 增加观察者
public void addObserver(Observer observer) {
this.observerVector.add(observer);
}
// 删除观察者
public void removeObserver(Observer observer) {
this.observerVector.remove(observer);
}
// 通知所有观察者
public void notifyObservers(String info) {
for (Observer observer : this.observerVector) {
observer.update(info);
}
}
}
/**
* 观察者接口
*/
public interface Observer {
public void update(String info);
}
/**
* 真实的被观察者
*/
public class RealSubject extends Subject {
public void operate() {
System.out.println("被观察者有行动了");
String info = "我在玩游戏";
super.notifyObservers(info);
}
}
/**
* 真实的观察者
*/
public class RealObserver implements Observer {
@Override
public void update(String info) {
System.out.println("观察者接收到消息:" + info);
}
}
测试代码:
/**
* 测试观察者模式
*/
public class TestObserver {
public static void main(String[] args) {
RealSubject subject = new RealSubject();
Observer observer = new RealObserver();
subject.addObserver(observer);
subject.operate();
}
}
运行结果:
被观察者有行动了
观察者接收到消息:我在玩游戏
二、用jdk自带的观察者接口的示例代码
/**
* 使用jdk自带的Observer接口
*/
public class RealSubject extends Observable {
public void operate() {
System.out.println("被观察者有行动了");
String info = "我在玩游戏";
super.setChanged(); // 触发变化
super.notifyObservers(info);
}
}
public class RealObserver implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println("观察者接收到消息:" + arg.toString());
}
}
测试代码:
public class Test {
public static void main(String[] args) {
RealSubject subject = new RealSubject();
RealObserver observer = new RealObserver();
subject.addObserver(observer);
subject.operate();
}
}
运行结果:
被观察者有行动了
观察者接收到消息:我在玩游戏
观察者模式大量的应用在消息队列的处理机制中。