訪問者模式(Visitor)

2021-07-22 22:55:36 字數 2475 閱讀 3684

訪問者模式(visitor)

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

應用:作用於編譯器語法樹的語義分析演算法。

模式結構

心得

訪問者模式是要解決對物件新增新的操作和功能時候,如何盡可能不修改物件的類的一種方法。一般為物件新增功能,是需要向物件新增成員函式。但這裡對物件(concreteelement)新增了乙個統一的介面——accept,來接收乙個訪問者物件。如何把對物件的操作移出到類外,正是接收引數(visitor)的作用。它通過呼叫visitor的介面函式visitconcreteelement針對當前物件進行操作,當然,當前物件的指標需要被作為引數傳遞出去,以便對物件狀態進行訪問。這樣,擁有element集合的物件objectstruct只要通過遍歷操作,每次呼叫物件的accept介面就可以讓物件自動告訴訪問者使用執行什麼樣的功能了。當需要為物件擴充套件功能時,只需要再新增乙個訪問者,重定義對每類物件進行訪問的方式就可以了。這裡涉及乙個雙向分派的概念,即accept操作的呼叫者(element)是執行時多型的,而且引數visitor也是執行時多型的。正是因為如此,才讓使用者可以通過將新添的功能封裝為物件,來實現對物件集合批量的不同操作。

舉例

這裡其實可以把element想象為編譯器的抽象語法樹節點,concreteelement可以看作具體的樹節點,如賦值語句和變數訪問節點。visitor就可以看作語義分析階段的語義檢查,concretevistor可以看作型別檢查功能和**生成功能。這些語義分析的功能顯然不應該和語法樹放在一起,那麼把它封裝為訪問者,讓他們為不同的節點生成單獨的分析流程和演算法。再在節點物件內部使用統一介面accept呼叫對應的演算法即可,節點內容通過自身的物件指標傳遞給訪問者物件。按照圖中所示關係,我們給出c++**如下:

//元素基類

class visitor;

class element

};

//訪問者基類

class concreteelementa;

class concreteelementb;

class visitor

};

//具體元素

class concreteelementa:

public element

void operationa()

void operationb()

virtual

void visitconcreteelementb(concreteelementb*eb)

};

class concretevisitor2:

public visitor

virtual

void visitconcreteelementb(concreteelementb*eb)

};

//管理和遍歷元素集合的高層類

class objectstruct

void delelement(element*e)

void dispaly(visitor*v)

} ~objectstruct()

} };

這裡需要實現一下objectstruct類,因為它提供的物件集合的高層遍歷。使用者對元素的逐個操作被簡化為如下方式:

objectstruct os;

//初始化集合

os.addelement(

new concreteelementa());

os.addelement(

new concreteelementb());

os.addelement(

new concreteelementb());

os.addelement(

new concreteelementa());

visitor*v1=

new concretevisitor1();

//建立訪問者1

visitor*v2=

new concretevisitor2();

os.dispaly(v1);

//用訪問者1對元素進行操作【雙向分派】

os.dispaly(v2);

由此看來,只要物件的繼承結構(資料結構)變化不大的情況下,比如不會新增新的型別的節點,使用visitor模式是非常合適的。使用者只要按需建立合適的訪問者類實現之,然後遍歷集合物件,直接「訪問」就可以了。額外需要說明的一點是,訪問者並不一定讓具體元素類繼承於統一的父類,從訪問者抽象類也能看出,抽象類介面僅僅依賴於具體實現的類。之所以讓它們具有公共的基類主要是還是為了批量操作的方便,即使沒有繼承統一的基類,訪問者模式依然能工作,也能為具體的類新增功能。

參考文章

Visitor(訪問者模式)

名 稱 visitor 訪問者模式 意 圖 表示乙個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。適 用 環 境 u 乙個物件結構包含很多類物件,它們有不同的介面,而你想對這些物件實施一些依賴於其具體類的操作。u 需要對乙個物件結構中的物件進行很多...

訪問者模式(Visitor)

訪問者模式 visitor 表示乙個作用於某物件結構中的各元素的操作。他使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。訪問者模式適用於資料結構相對穩定的系統。他把資料結構和作用於結構上的操作之間的耦合解脫開,使得操作集合可以相對自由地演化。訪問者模式的目的是要把處理從資料結構分離出來...

訪問者模式 Visitor

訪問者模式 visitor 首先看一下男人與女人不同狀態下反應的實現 結構圖 狀態的抽象類和人的抽象類 abstract class action abstract class person 在這裡關鍵在於人只分為男人與女人,分類穩定 具體狀態類 成功 class success action 時,...