意圖
將作用於某個資料結構中的各個元素的操作集合成乙個操作類。這樣當需要擴充套件對資料結構中元素的操作時只需擴充套件操作類而不是修改資料結構中的操作物件類本身。
動機
考慮乙個使用組合模式形成的樹狀資料結構。使用組合模式的乙個好處就是可以以透明的方式增加對於整個資料結構中每個要素的操作。實現方式非常簡單,就是在組合類composite中準備乙個相同的方法,在這個方法中呼叫每個子要素的對應方法。
這種方式真的很好用,至少在最初使用這種方法增加功能時設計者一定是這樣認為的。但是隨著使用次數的增多,設計者早晚會發現:每次都是同樣的結構,稍微換一下操作的內容就變成了另外乙個功能。def reset_connections(self, memo):
component.reset_connections(self, memo)
for child in self.iter():
child.reset_connections(memo)
這種重複性往好的方向看可以說是使用同樣的方式解決了不同的問題,降低了增加新功能的難度,這當然沒有錯。但是從另乙個角度來說,畢竟增加功能時修改了已有的**。是不是可以在不修改已有**的情況下,增加新功能呢?
同樣的結構就是這個問題的突破口,而訪問者模式就是這個問題的解決之策。
設計模式 訪問者模式
訪問者模式是一種資料操作與資料結構分離的設計模式,訪問者模式的基本想法是,軟體系統中擁有乙個由許多物件構成的 比較穩定的物件結構,這些物件的類都擁有乙個accept方法用來接受訪問者物件的訪問。訪問者是乙個介面,它擁有乙個visit方法,這個方法對訪問到的物件結構中不同型別的元素作出不同的處理。在物...
設計模式 訪問者模式
訪問者模式 visitor 表示乙個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。例子 男人和女人在不同的狀態下會有不同反應,採用訪問者模式,可以增加狀態很方便 抽象狀態類 class action 男人反應 virtual void getwom...
設計模式 訪問者模式
在訪問者模式 visitor pattern 中,我們使用了乙個訪問者類,它改變了元素類的執行演算法。通過這種方式,元素的執行演算法可以隨著訪問者改變而改變。這種型別的設計模式屬於行為型模式。根據模式,元素物件已接受訪問者物件,這樣訪問者物件就可以處理元素物件上的操作。1 符合單一職責原則。2 優秀...