Visitor模式小節

2021-04-09 04:41:42 字數 938 閱讀 6111

今天看scott meyers的《my most important c++ aha! moments...ever》這篇文章(http://www.artima.com/cppsource/top_cpp_aha_moments.html),裡面有一點「understanding what problem visitor addresses」,這個visitor模式我一直都不是非常清楚,今天再仔細看了下gof的那本書,總結如下:

表示乙個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。

某些場合,使用該模式之前會出現的問題:

1.在乙個型別體系結構中,每乙個類的介面都非常多,難以理解和修改。(比如編譯器中,每乙個node型別中都包含型別檢查,格式化答應,流分析,**優化等等介面)

2.增加新的操作通常需要重新編譯所有這些類

visitor模式的實現

使用visitor模式,必須定義兩個類層次:乙個對應於接受操作的元素(node層次)另一

個對應於定義對元素的操作的訪問者(nodevisitor層次)。給訪問者類層次增加乙個新的子類

即可建立乙個新的操作。但是如果要增加乙個新的node型別,則會導致nodevisitor類層次中的所有類都必須增加乙個相應的函式。

visitor適用場合

需要對乙個物件結構中的物件進行很多不同的並且不相關的操作,而你想避免讓這些操作「汙染」這些物件的類。visitor使得你可以將相關的操作集中起來定義在乙個類中。

當該物件結構被很多應用共享時,用visitor模式讓每個應用僅包含需要用到的操作。

定義物件結構的類很少改變,但經常需要在此結構上定義新的操作。

使用visitor模式的好處

訪問者模式使得易於增加新的操作

訪問者集中相關的操作而分離無關的操作

缺點增加新的concreteelement類很困難

破壞封裝 

Visitor設計模式

物件導向系統的開發和設計過程,經常會遇到一種情況就是需求變更 requirement changing 經常做好的乙個設計 實現了乙個系統原型,客戶又會有了新的需求。因此不得不去修改已有的設計,最常見就是解決方案就是給已經設計 實現好的類新增新的方法去實現客戶新的需求,這樣就陷入了設計變更的夢魘 不...

visitor 訪問模式

採用 雙重委派 方式,使訪問者和被訪問物件進行隔離。有點難理解。它有一定的應用侷限性,訪問者和被訪問者應該可被列舉,結構相對固定。比如說 運算子處理與資料結構的關係。運算子 可列舉,型別如string,int object也是可以列舉的 我們以處理運算表示式為例,來寫個例子,只涉及 型別只涉及int...

Behavioral模式之Visitor模式

表示乙個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。無考慮乙個編譯器,他將源程式表示為乙個抽象語法樹。該編譯器需要在抽象語法上實施某些操作以進行 靜態語義 分析,例如檢查是否所有的變數都已經被定義了。他也需要生成 因為它可能要定義許多操作以進行 ...