- 目的 : 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
- 核心 :主题(Subject/Observable)维护观察者列表,提供注册、注销和通知方法。观察者(Observer)实现更新接口。主题状态改变时,调用所有注册观察者的更新方法。
- 场景 :常用于实现事件处理系统,如GUI组件的事件监听、股票价格变动通知等,当状态改变时自动通知所有订阅者。
首先是观察者接口,定义更新方法
java
package observer;
public interface IWatcher {
void update();
}
与一个具体观察类
java
package observer;
public class UpdateWatcher implements IWatcher{
@Override
public void update() { // 当被观察对象发生变化时,此方法会被调用
System.out.println(this + " 观察到目标已经更新了。");
}
}
然后有一个被观察者接口(也称主题接口 Subject)
java
package observer;
public interface IWathedSubject {
void add(IWatcher watcher); // 添加观察者
void remove(IWatcher watcher); // 移除观察者
void update(); // 更新主题状态
void notifyWatchers(); // 通知所有观察者
}
与具体被观察者类
java
package observer;
import java.util.ArrayList;
import java.util.List;
public class UpdateWatchedSubject implements IWathedSubject {
private List<IWatcher> list; // 存储观察者列表
public UpdateWatchedSubject() {
this.list = new ArrayList<>(); // 初始化观察者列表
}
@Override
public void add(IWatcher watcher) { // 添加新的观察者
this.list.add(watcher);
}
@Override
public void remove(IWatcher watcher) { // 移除指定的观察者
this.list.remove(watcher);
}
@Override
public void update() { // 主题状态发生变化时调用
System.out.println("目标主题状态已更新..."); // 职责分离 状态变更的预处理
notifyWatchers(); // 纯粹执行观察者通知
}
@Override
public void notifyWatchers() { // 纯粹执行 通知观察者
for(IWatcher watcher : list){ // 遍历观察者列表
watcher.update(); // 调用每个观察者的反应方法
}
}
}
最后是函数入口
java
package observer;
public class MainTest {
public static void main(String[] args) {
//自定义观察者模式
IWathedSubject watched = new UpdateWatchedSubject(); //创建主题
watched.add(new UpdateWatcher()); //创建三个观察者
watched.add(new UpdateWatcher());
watched.add(new UpdateWatcher());
watched.update(); //主题状态变化 通知每个观察者
System.out.println();
}
}
终端输出
目标主题状态已更新...
observer.observer.UpdateWatcher@4aa298b7 观察到目标已经更新了。
observer.observer.UpdateWatcher@7d4991ad 观察到目标已经更新了。
observer.observer.UpdateWatcher@28d93b30 观察到目标已经更新了。
