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

訪問者模式深度解析:雙重分派實現垃圾分類系統功能擴展

     編輯:Java 相關知識

訪問者模式適用場景

不再關心新增 Trash 類型優化。假設基礎類結構固定不變(來自他開發者/公司,無權修改),但希望在結構中新增多型方法。困境:需向基礎類添加方法卻不能動基礎類。訪問者模式創建獨立 Visitor 類結構虛擬化後續操作,基礎類只需「接受」訪問者並調用訪問者動態綁定方法。

雙重分派機制

v.accept(pv) 觸發兩次多型調用:第一次選擇 accept() 的 Aluminum 版本;第二次在 accept() 內透過基礎類 Visitor 引用動態調用 visit() 特定版本。配置意味著可用 Visitor 新子類形式向系統添加新多型功能,無需動 Trash 結構——此為訪問者模式最大優點。防止主控 Trash 序列向單一類型序列分類,所有東西留在主控序列,傳遞適當訪問者達標目標(避免 RTTI)。

完整實作結構

Visitable 介面:新增 accept(Visitor v) 方法。
具體 Trash 子類:VAluminum/VPaper/VGlass/VCardboard 繼承原類別實作 Visitable,accept() 呼叫 v.visit(this)。
Visitor 介面:宣告 visit(VAluminum)/visit(VPaper)/visit(VGlass)/visit(VCardboard)。
具體訪問者:PriceVisitor 計算總價值、WeightVisitor 追蹤重量。
主程式:單一垃圾筒 Vector,兩訪問者物件遍歷序列每元素呼叫 accept(),訪問者內部追蹤數據計算總計。取出元素時除不可避免向 Trash 轉型外,無運行期類型驗證。

與雙重分派對比及耦合分析

區別:雙重分派每子類只多載一個 add();訪問者每子類必須多載所有 visit()。Trash 與 Visitor 結構間存在明顯「耦合」,但內部高度內聚(Trash 描述垃圾、Visitor 描述行動)。優秀設計良好開端。僅添加新 Visitor 類型受益,添加新 Trash 類型顯礙手腳。類間低耦合、類內高內聚為重要目標,但某些類不可避免存在「親密」關係,稱「對聯」(如集合與迭代器),Trash-Visitor 亦屬此類。

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