監聽器是實現特定接口的普通 Java 類,專門監聽另一個類的方法調用或狀態變化。本質是觀察者模式:定義對象間一對多依賴,當主題對象狀態改變時,所有依賴者自動收到通知並更新。
interface IPersonRunListener {
void fighting(PersonEvent pe);
}
class PersonEvent {
private Person source;
public PersonEvent(Person source) { this.source = source; }
public Person getSource() { return source; }
public String getName() { return source.getName(); }
}
class Person {
private String name;
private IPersonRunListener listener;
public Person(String name) { this.name = name; }
public void run() {
System.out.println(name + " 開始跑了..");
if (listener != null) listener.fighting(new PersonEvent(this));
}
public void addListener(IPersonRunListener l) { this.listener = l; }
public String getName() { return name; }
}
public class Demo {
public static void main(String[] args) {
Person p1 = new Person("張三");
p1.addListener(pe -> {
System.out.println(pe.getSource() + " 已經跑完了...");
if ("張三".equals(pe.getName())) System.out.println("張三跑到了第一名!");
});
p1.run();
}
}
| 接口 | 監聽對象 | 典型用途 |
|---|---|---|
| ServletContextListener | Web 應用上下文 | 項目啟動初始化、關閉銷毀資源 |
| HttpSessionListener | 用戶 Session | 在線人數統計、Session 創建銷毀日誌 |
| ServletRequestListener | HTTP 請求 | 請求耗時統計、參數記錄 |
| ServletContextAttributeListener | 上下文屬性變更 | 共享數據變更通知 |
| HttpSessionAttributeListener | Session 屬性變更 | 購物車商品增減同步 |