首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

IOU 設計模式:非同步程式設計的靈活契約

     編輯:Java 相關知識

核心思想:債務憑證解耦時空

IOU(I Owe You)源自現實債務關係:債務人經可靠第三方託管賬戶向債權人發放憑證;提交結果終止憑證;債權人憑憑證贖回結果。雙方在時空上最大程度分離解耦。1996 年 Allan Vermeulen 首次引入軟體設計。普通方法同步調用阻塞呼叫者;IOU 模式下方法立即返回 `IOU` 物件承諾終止,呼叫者無需等待繼續他務,提升並發與非同步性。關鍵優勢:不依賴特定非同步機制(線程、事件、遠程調用、用戶輸入皆可),具普遍適用性。

模式結構:三大核心介面

IOU 介面:兩狀態(未終止/已終止)、四操作:查詢狀態 `closed()`、等待終止 `standBy()`、贖回結果 `redeem()`(未終止則阻塞)、管理回調 `addCallback`/`removeCallback`。
Escrow 介面:第三方託管。`issueIou()` 發布憑證、`close(Object o)` 終止並設置結果。
Callback 介面:`callback(Object o)` 在結果上執行回調任務。IOU 維護回調列表,終止時逐一驅動。

Java 基礎實現:RealIouEscrow

合併實現 `IOU`、`Escrow` 介面。`Vector` 存回調,`boolean closed` 標記,`Object objectIou` 存結果。`issueIou()` 回傳 `this`。`addCallback`:若已終止即回調,否則加列表。`redeem()`:未終止則 `standBy()`(`synchronized wait()`)。`close(Object o)`:設結果、設標記、`notifyAll()`、遍歷回調執行。線程安全用 `synchronized` 修飾。

使用模式:被調用者與呼叫者

被調用者:建 `Escrow` → 啟動非同步服務關聯 `Escrow` → 回傳 `issueIou()`。呼叫者:得 `IOU` → 幹別事 → 需結果時 `redeem()` → 強轉真實類型 → 調用方法。缺點:方法統一回傳 `IOU` 隱藏真實類型,用戶須記憶強轉,友好性不足。

雙劍合璧:IOU + Java 動態代理

理想:方法回傳真實類型。動態代理可為任意介面組建代理物件,同時實現 `IOU` 與目標介面,安全轉型。擴展 `RealIouEscrowEx` 繼承 `RealIouEscrow` 實現 `InvocationHandler`。構造器驗證目標為介面。`issueIou()` 回傳 `Proxy.newProxyInstance` 代理(類加載器、介面陣列 `[target, IOU]`、handler `this`)。`invoke` 分派:若方法來自 `IOU` 介面,目標設 `this`;否則檢查終止、未終止 `standBy()`、`redeem()` 獲真實結果為目標 → 反射調用。呼叫者體驗透明等待,如同同步調用。

改進後模型

被調用者:建 `RealIouEscrowEx(Foo.class)` → 啟動服務 → 回傳 `(Foo)escrow.issueIou()`。呼叫者:`Foo foo = method()` → 幹別事 → 直接 `foo.bar()`,效果等價真實結果調用。

實例演示:女管家的平行家務

介面:`Processable`(`process()`)、`Clothes`、`Food`(`addSpice()`)。實現:`ClothesImpl`、`FoodImpl`。非同步服務 `AsyncService`(後台線程處理 `Processable` 調用 `process()` 終止 `Escrow`)。`HouseKeeper`:安排洗衣 `wash()` 回傳傳統 `IOU` → 幹別事 → 安排烹飪 `cook()` 回傳擴展 `IOU`(`Food` 型) → 幹別事 → `eat(food)` 直接 `food.addSpice()`(代理攔截等待烹飪完成) → `hangout(iou)` 檢查等待贖回衣物。輸出日誌顯示:洗衣 1162ms、烹飪 889ms 並行,女管家僅在 `addSpice()` 經歷一次透明等待,其餘時間全利用。展現擴展 IOU 模式魅力:並行執行、單一等待、透明體驗。

總結

IOU 模式獨到提升並發性;引入動態代理的擴展版融入友好體驗,珠聯璧合。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved