C 程式設計 Visitor模式 訪問者

2021-06-17 19:20:56 字數 2031 閱讀 4660

c++程式設計 visitor模式(訪問者)

到底什麼是"訪問者"?

說白了,就是"觀察者+使用者"。我們日常使用的電子產品,其外包裝就是乙個"訪問者"。當我們組裝乙個電路的時候,我們並有沒有改變電路元件自身的特性,而是搭積木一樣組合出了我們想要的功能,然後用乙個黑色的盒子包裝了起來,形成了乙個產品。而用這個產品的人,看到的只是我這個"盒子"所提供的輸入輸出介面,他並沒有直接訪問裡面的元件。

這種設計模式和"抽象工廠"或者"工廠方法"有個本質的不同。工廠方法的核心內容是提供乙個物件,這個物件繼承了我的介面。而"訪問者"模式並不提供這個物件的指標,不負責建立和銷毀;而是提供乙個經過組合的功能的"集合",它似乎是乙個"物件",但是本身並不完成任何實際的功能,把實際物件本身隔離開了。當我需要提供某種新的功能的時候,我只需要設計乙個新的"visitor"就可以了。

再有一點,工廠方法返回的物件,他們的行為都是類似的;而不同的visitor之間要做的事情,可能千差萬別,因為他可以操作不同類的物件。

舉乙個例子,例如visitor是乙個將軍,他有乙個廚子c2,有乙個士兵c1。那麼visitor可以設計成: 士兵攻擊,廚子燒飯;也可以設計成: 廚子燒飯,士兵射擊,士兵吃飯,廚子洗鍋。這裡,visitor就是將軍發出的指令集合。士兵和廚子的能力範圍並沒有變,改變的只是乙個visitor的方法集合與順序。當然,士兵和廚子本身除了完成功能的能力之外,還要從"人"(base)這個基類進行繼承,並且實現"服從命令"(accetp)這個函式。這樣的話,將軍的命令就能在不同的下屬之間順序的進行了。下面是乙個例子程式。

#include

struct visitor;

struct base;

struct c1:public base

};struct c2:public base

};struct visitor

};void c1::accept()

void c2::accept()

int main(void)

當然,這樣的設計還有乙個缺點,就是"士兵"c1和"廚子"c2本身的"接受命令"函式accept需要指定如何去完成命令。但是我們知道這個命令只應該來自將軍。所以進一步改進這個程式,使得accept函式是按照將軍的命令完陳任務。這樣的話,指令**就在visitor那裡了,下屬並不需要做任何功能上的修改。

#include

struct visitor;

struct base;

struct c1:public base

};struct c2:public base

};struct visitor

void run(c1* o1)

void run(c2* o2)

};void c1::accept(visitor* pv)

void c2::accept(visitor* pv)

int main(void)

執行結果是:

c1c2

訪問者模式有如下的優點:

訪問者模式使得增加新的操作變得很容易。如果一些操作依賴於乙個複雜的結構物件的話,那麼一般而言,增加新的操作會很複雜。而使用訪問者模式,增加新的操作就意味著增加乙個新的訪問者類,因此,變得很容易。

訪問者模式將有關的行為集中到乙個訪問者物件中,而不是分散到乙個個的節點類中。

訪問者模式可以跨過幾個類的等級結構訪問屬於不同的等級結構的成員類。迭代子只能訪問屬於同乙個型別等級結構的成員物件,而不能訪問屬於不同等級結構的物件。訪問者模式可以做到這一點。

積累狀態。每乙個單獨的訪問者物件都集中了相關的行為,從而也就可以在訪問的過程中將執行操作的狀態積累在自己內部,而不是分散到很多的節點物件中。這是有益於系統維護的優點。

訪問者模式有如下的缺點:

增加新的節點類變得很困難。每增加乙個新的節點都意味著要在抽象訪問者角色中增加乙個新的抽象操作,並在每乙個具體訪問者類中增加相應的具體操作。

破壞封裝。訪問者模式要求訪問者物件訪問並呼叫每乙個節點物件的操作,這隱含了乙個對所有節點物件的要求:它們必須暴露一些自己的操作和內部狀態。不然,訪問者的訪問就變得沒有意義。由於訪問者物件自己會積累訪問操作所需的狀態,從而使這些狀態不再儲存在節點物件中,這也是破壞封裝的。

Visitor(訪問者模式)

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

訪問者模式(Visitor)

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

訪問者模式 Visitor

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