回調三種調用方式
| 方式 | 特徵 | 例子 |
| 同步調用 | 阻塞等待結果 | 普通方法呼叫 |
| 回調 | 雙向,被調用者主動通知調用者 | 介面回調、事件監聽 |
| 異步調用 | 非阻塞,透過訊息/執行緒通知 | Future, CompletableFuture, 消息隊列 |
完整實作:客戶端-伺服端異步回調
1. 回調介面
public interface CSCallBack {
void process(String status);
}
2. 客戶端 (實作回調)
public class Client implements CSCallBack {
private Server server;
public Client(Server server) { this.server = server; }
public void sendMsg(final String msg) {
System.out.println("客戶端發送: " + msg);
new Thread(() -> server.getClientMsg(this, msg)).start(); // 異步執行
System.out.println("客戶端異步發送成功");
}
@Override
public void process(String status) {
System.out.println("客戶端收到回調: " + status);
}
}
3. 伺服端 (觸發回調)
public class Server {
public void getClientMsg(CSCallBack callback, String msg) {
System.out.println("伺服端收到: " + msg);
try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); }
System.out.println("伺服端處理完成,回調 200");
callback.process("200"); // 執行回調
}
}
4. 執行結果
客戶端發送: Server,Hello~
客戶端異步發送成功
伺服端收到: Server,Hello~
(等待 5 秒)
伺服端處理完成,回調 200
客戶端收到回調: 200
核心設計要點
- 介面作為方法參數,實際傳入實作類實例 (多型)
- 異步執行用
new Thread() 或線程池
- 回調方法在伺服端執行緒中執行 (注意執行緒安全)
應用場景
- Windows 訊息機制 (WndProc)
- 微信/支付寶異步通知 (HTTP 回調)
- Servlet Filter (容器管理回調鏈)
- JDBC Statement.setFetchSize / ResultSet 回調
Filter vs Interceptor
| 特性 | Filter | Interceptor |
| 基礎機制 | 回調 (容器呼叫 doFilter) | 反射/動態代理 (AOP) |
| 依賴容器 | 是 (Servlet 規範) | 否 (Spring 管理) |
| 攔截範圍 | 所有請求 | 特定 Bean 方法 |
| 執行順序 | web.xml 定義 | @Order / 優先級 |
觀察者模式 vs 介面回調
- 觀察者模式:一對多,主題狀態變更通知所有觀察者,是回調的一種具體實現形式
- 介面回調:一對一/一對少,通用機制,是設計原理
心得總結
- 機制 = 原理 (回調)
- 模式 = 體現 (觀察者)
- 記住典型場景 (Filter, 異步通知)
- 深入理解底層原理 (多型、執行緒、記憶體可見性)