🎯 什麼情境該想到我
當你「客戶端得先向伺服器物件要出它內部的委託物件,再去呼叫那個委託物件」(例如 person.getDepartment().getManager())的時候——這讓客戶端知道了太多內部結構,內部一改就牽動客戶端。在伺服器類別上加一個轉呼叫方法,把委託藏起來,斬斷這條訊息鏈。
⚙️ 怎麼用(步驟 / 公式)
意圖:在伺服器類別上提供轉呼叫方法,讓客戶端不必知道背後的委託物件。
動作要點(小步安全進行):
- 找出客戶端「先取得委託物件、再對它呼叫」的用法。
- 在伺服器類別上,為客戶端需要的每個委託操作,建立一個簡單的委託方法(內部自己去呼叫委託物件)。
- 逐一把客戶端改成呼叫伺服器上的這個新方法,不再自行取得委託物件,每步測試。
- 若都改完後,客戶端已不需要那個取得委託物件的存取器,就移除它,真正把委託隱藏起來。
🧪 我實際套用的紀錄
- (待填)
⚠️ 注意 / 什麼時候不適用
- 若很多客戶端需要委託物件的大量不同方法,伺服器會被迫長出一堆轉呼叫方法(形成「中間人」壞味道);這時反而該反向做「移除中間人」,讓客戶端直接使用委託物件。
- 對治的壞味道:訊息鏈(Message Chains)。
- 反向手法:移除中間人(Remove Middle Man)。
🔗 相關工具
- 提煉類別 Extract Class(拆出新類別後常搭配此手法隱藏委託)
- 封裝變數 Encapsulate Variable(同屬「隱藏內部、控管存取」的精神)
- 重構