意圖
将作用于某個資料結構中的各個元素的操作集合成一個操作類。這樣當需要擴充對資料結構中元素的操作時隻需擴充操作類而不是修改資料結構中的操作對象類本身。
動機
考慮一個使用組合模式形成的樹狀資料結構。使用組合模式的一個好處就是可以以透明的方式增加對于整個資料結構中每個要素的操作。實作方式非常簡單,就是在組合類Composite中準備一個相同的方法,在這個方法中調用每個子要素的對應方法。
def reset_connections(self, memo): Component.reset_connections(self, memo) for child in self.iter(): child.reset_connections(memo)
這種方式真的很好用,至少在最初使用這種方法增加功能時設計者一定是這樣認為的。但是随着使用次數的增多,設計者早晚會發現:每次都是同樣的結構,稍微換一下操作的内容就變成了另外一個功能。
這種重複性往好的方向看可以說是使用同樣的方式解決了不同的問題,降低了增加新功能的難度,這當然沒有錯。但是從另一個角度來說,畢竟增加功能時修改了已有的代碼。是不是可以在不修改已有代碼的情況下,增加新功能呢?
同樣的結構就是這個問題的突破口,而通路者模式就是這個問題的解決之策。