「好萊塢原則」:**Don't call us, we'll call you**。底層庫在事件發生時調用上層提供的接口方法。
| 類型 | 特點 | 例子 |
|---|---|---|
| 同步調用 | 阻塞等待結果 | 普通方法調用 |
| 回調 | 雙向:調用者傳入接口,被調用者稍後回調 | 事件監聽器 |
| 異步調用 | 發起後立即返回,通過消息/線程通知完成 | Future/CompletableFuture |
public interface Callback {
void onResult(String status);
}
public class Client implements Callback {
private Server server;
public Client(Server server) { this.server = server; }
public void sendMsg(final String msg) {
System.out.println("客戶端發送: " + msg);
new Thread(() -> server.receive(this, msg)).start(); // 異步
System.out.println("客戶端異步發送成功,繼續其他工作");
}
@Override public void onResult(String status) {
System.out.println("客戶端收到回調: " + status);
}
}
public class Server {
public void receive(Callback cb, String msg) {
System.out.println("服務端收到: " + msg);
try { Thread.sleep(5000); } catch (InterruptedException ignored) {} // 模擬處理
System.out.println("服務端處理完成");
cb.onResult("200 OK"); // 回調
}
}
public class Test {
public static void main(String[] args) {
Server s = new Server();
Client c = new Client(s);
c.sendMsg("Hello Server");
System.out.println("主線程未阻塞,繼續執行...");
}
}
new Thread(...).start()this 作為回調對象傳給服務端WndProc)Filter (容器回調)| 維度 | 接口回調 | 觀察者模式 |
|---|---|---|
| 本質 | 機制/原理 | 設計模式 (具體實現) |
| 關係 | 一對一 (通常) | 一對多 (主題-觀察者) |
| 解耦程度 | 較低 (直接持有接口引用) | 較高 (主題不知觀察者具體類) |
| 實現基礎 | 即回調機制 | 基於回調實現 |
觀察者模式 = 回調機制 + 註冊/通知框架 + 多對一廣播。