何時不應使用訪問者模式
傾斜的可擴展性
- **僅適用於節點結構極其穩定**的系統
- 新增節點類別 = 每個訪問者類別都要新增對應方法 = **大規模修改** = 違反開閉原則
- 反之,新增操作(訪問者)極其容易:只需新增一個訪問者類別
- 結論:**數據結構頻繁變化的系統不適合**使用訪問者模式
開閉原則與變化封裝
- 核心原則:**對擴展開放,對修改關閉**
- 達到途徑:**封裝變化點**
- 系統可分為:演算法物件 + 數據結構物件
適合訪問者模式的場景
- 數據結構**穩定**
- 演算法/操作**易變、頻繁新增**
- 訪問者模式讓「新增操作」變得容易
不適合的場景
- 數據結構**頻繁新增節點**
- 需在抽象訪問者與所有具體訪問者中同步新增方法
優點總結
- 新增操作極易:新增訪問者類別即可
- 行為集中化:相關行為聚合在訪問者中,而非分散在節點類別
- 跨層級結構訪問:迭代器僅能同類型結構,訪問者可跨不同層級結構
- 狀態累積:訪問過程中在自身內部累積狀態,利於維護
缺點總結
- 新增節點極難:需修改抽象訪問者 + 所有具體訪問者
- 破壞封裝:節點必須暴露內部操作/狀態給訪問者;訪問者累積狀態導致節點狀態外移
決策檢查清單
□ 數據結構是否穩定?(未來極少新增節點類別)
□ 操作/演算法是否頻繁變化或新增?
□ 是否需要跨不同類別層級結構操作?
□ 是否接受節點暴露內部細節?
□ 團隊是否理解雙重分派機制?