設計模式(22) - 訪問者模式

 問題描述

集合的節點元素類型相對穩定,但是,在遍歷集合各個節點元素的時候,針對不同類型節點元素的訪問操作各不相同;並且將來更可能會添加新的訪問操作。如果把這些訪問操作實現成節點元素的方法,那麼這種訪問方法就成爲節點類型的一個變化點。如何避免對節點元素的修改而又支持新的節點方法呢?訪問者模式!

訪問者模式

如圖所示,由於系統中元素節點類型相對穩定(例如ConcreteElementA & ConcreteElementB),Visitor類型定義了訪問每個節點元素的方法(即VisitConcreteElementA() & VisitConcreteElementB()),這個Visitor接口定義會保持相對穩定。Element類型定義了一個抽象接口VisitMe(Visitior* v);節點元素ConcreteElementA和ConcreteElementB實現VisitMe()接口非常簡單:以this指針作爲參數調用Visitor定義的訪問自己接口。顯然,當系統需要提供不同的訪問Element方法的時候,只要繼承Visitor接口並實現相應的訪問方法即可;這個過程對於Element節點元素保持透明。


討論

系統在遍歷節點元素的過程中,爲不同的節點元素提供不同的訪問方法;創建新的Visitor具體類可以方便的定義節點元素的新的訪問方法而不影響Element的設計,這就是訪問者模式爲程序提供的一種封裝變化點的方法。訪問者模式隔離了元素和元素的訪問方法。客戶通過一個Visitor對象就可以遍歷集合中不同的節點類型並自動調度節點相關的訪問方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章