天天看點

Aha!設計模式(106)-通路者模式(2)

結構

面向對象中封裝的想法是将資料和操作資料的方法集中在一個類中,以達到高内聚低耦合的效果。但是有時也會希望将目的相關或相同的針對不同類型的操作集中到一個類中。這種方式就是通路者模式,它的結構如下:

Aha!設計模式(106)-通路者模式(2)

上圖引用自《設計模式》一書

通路者類Visitor定義兩個不同的接口分别用于通路構造圖下半部分的兩個Element的派生類。通路者類Visitor通過不同的方法決定它的派生類可以通路的對象類型。

具象通路者類ConcreteVisitor類負責具體實作一組針對通路者類指定的對象的具體操作。每個通路方法往往是某個更大算法的一部分,是以經常會需要使用具象通路者類的資料成員來儲存這個算法的資訊。由于需求的不同,并不要求每個具象類都必須實作所有的通路方法。

元素類Element作為要素類的基類,首先應該有自己的功能,然後才是為繼承層次上的具象要素類定義用來接納通路者類的accpet方法。也可以定義一個隻有accept方法的抽象類,但是個人覺得這多少有些本末倒置的感覺。要素類的類結構還是應該按照其本身的需求進行設計,而不是為了通路者模式這麼一個實作層面的便利而改變。

具象要素類ConcreteElement作為通路者的通路對象,負責招待通路者。在它的accept方法中會調用Visitor的對應方法。這個過程可以看作是将具象Visitor類和通路對象放到一起之後,通路對象和Visitor的通路方法之間實作自動比對。這也可以認為是一種重載,是通路者模式最為神奇的地方。

繼續閱讀