觀察者模式定義了對象之間的一種一對多依賴關係,當一個對象(被觀察者/主題)狀態發生改變時,所有依賴於它的對象(觀察者)都會得到通知並自動更新。作為行為型設計模式,它廣泛應用於事件處理系統、GUI 程式設計、消息推送等場景。
標準觀察者模式包含四個核心角色:
update() 方法public interface Subject {
void registerObserver(Observer o);
void removeObserver(Observer o);
void notifyAllObservers();
}
public interface Observer {
void update(Subject s);
}
import java.util.ArrayList;
public class HeadHunter implements Subject {
private ArrayList<Observer> userList = new ArrayList<>();
private ArrayList<String> jobs = new ArrayList<>();
@Override
public void registerObserver(Observer o) {
userList.add(o);
}
@Override
public void removeObserver(Observer o) {
userList.remove(o);
}
@Override
public void notifyAllObservers() {
for (Observer o : userList) {
o.update(this);
}
}
public void addJob(String job) {
jobs.add(job);
notifyAllObservers();
}
public ArrayList<String> getJobs() {
return jobs;
}
}
public class JobSeeker implements Observer {
private String name;
public JobSeeker(String name) {
this.name = name;
}
@Override
public void update(Subject s) {
System.out.println(name + " 收到通知!");
System.out.println("職位列表:" + s);
}
}
public class Main {
public static void main(String[] args) {
HeadHunter hh = new HeadHunter();
hh.registerObserver(new JobSeeker("Mike"));
hh.registerObserver(new JobSeeker("Chris"));
hh.registerObserver(new JobSeeker("Jeff"));
hh.addJob("Google 職位");
hh.addJob("Yahoo 職位");
}
}
Java 標準庫提供 java.util.Observer 介面與 java.util.Observable 類,但注意:Observable 是類而非介面,限制了復用靈活性。Java 9 起標記為過時,建議改用 PropertyChangeListener、Flow API 或第三方事件總線(如 Guava EventBus、RxJava)。
equals/hashCode 避免重複註冊