1. 程式人生 > 其它 >第二十一章 訪問者模式 Visitor

第二十一章 訪問者模式 Visitor

行為型設計模式

定義:
  將作用於某種資料結構中的各元素的操作分離出來封裝成獨立的類,使其在不改變資料結構的前提下可以新增作用於這些元素的新的操作,為資料結構中的每個元素提供多種訪問方式。它將對資料的操作與資料結構進行分離,是行為類模式中最複雜的一種模式

類圖:

  

  抽象訪問者(Visitor)角色:定義一個訪問具體元素的介面,為每個具體元素類對應一個訪問操作 visit() ,該操作中的引數型別標識了被訪問的具體元素

  具體訪問者(ConcreteVisitor)角色:實現抽象訪問者角色中宣告的各個訪問操作,確定訪問者訪問一個元素時該做什麼

  抽象元素(Element)角色:宣告一個包含接受操作 accept() 的介面,被接受的訪問者物件作為 accept() 方法的引數

  具體元素(ConcreteElement)角色:實現抽象元素角色提供的 accept() 操作,其方法體通常都是 visitor.visit(this) ,另外具體元素中可能還包含本身業務邏輯的相關操作

  物件結構(Object Structure)角色:是一個包含元素角色的容器,提供讓訪問者物件遍歷容器中的所有元素的方法,通常由 List、Set、Map 等聚合類實現

應用:

  1、 一個物件結構包含很多類物件,它們有不同的介面,而你想對這些物件實施一些依賴於其具體類的操作   2、 需要對一個物件結構中的物件進行很多不同的並且不相關的操作,而你想避免讓這些操作“汙染”這些物件的類。Visitor模式使得你可以將相關的操作集中起來 定義在一個類  中   3、 當該物件結構被很多應用共享時,用Visitor模式讓每個應用僅包含需要用到的操作   4、定義物件結構的類很少改變,但經常需要在此結構上定義新的操作。改變物件結構類需要重定義對所有訪問者的介面,這可能需要很大的代價。如果物件結構類經常改變,那麼可能還是在這些類中定義這些操作較好