22 訪問者模式 Visitor

2021-06-22 19:41:15 字數 2622 閱讀 5569

visitor模式:

visitor模式表示乙個作用於某物件結構中的各元素的操作。它使你可以在不改變各元素的類的前提下定義作用於這些元素的新操作。visitor模式將有關的行為集中到乙個訪問者物件中,即將更新(變更)封裝到乙個類中(訪問操作),並由待更改類提供乙個接收介面。

visitor模式的目的是要把處理從資料結構分離出來。很多系統更可以按照演算法和資料結構分開,如果這樣的系統由比較穩定的資料結構,又有易於變化的演算法的話,使用visitor模式是比較合適的,因為visitor模式使得演算法操作的增加變得容易。反之,如果這樣的系統的資料結構物件易於變化,經常要有新的資料物件增加進來,就不適合使用訪問者模式。

visitor模式典型的結構圖為:

參考《大話設計模式》中關於visitor模式的講解,以男人和女人對於相同事物的態度的不同反應為例。將《設計模式精解-gof 23種設計模式解析》的例子稍作修改,以方便理解,其實現**如下:

#ifndef _visitor_h_

#define _visitor_h_

class concreteelementa;

class concreteelementb;

class element_person;

// 對事物的反應

class visitor_action

;// 對失戀的態度

class concretevisitora_lovesick : public visitor_action

;// 對結婚的態度

class concretevisitorb_marriage : public visitor_action

;#endif //~_visitor_h_

#include "visitor.h"

#include "element.h"

#include using namespace std;

visitor_action::visitor_action()

visitor_action::~visitor_action()

concretevisitora_lovesick::concretevisitora_lovesick()

concretevisitora_lovesick::~concretevisitora_lovesick()

void concretevisitora_lovesick::visitconcreteelementa(element_person* elm)

element_person::~element_person()

void element_person::accept(visitor_action* vis)

concreteelementa_women::concreteelementa_women()

concreteelementa_women::~concreteelementa_women()

void concreteelementa_women::accept(visitor_action* vis)

concreteelementb_men::concreteelementb_men()

concreteelementb_men::~concreteelementb_men()

void concreteelementb_men::accept(visitor_action* vis)

// main.cpp

#include "element.h"

#include "visitor.h"

#include using namespace std;

int main(int argc,char* argv)

正如前面所說,如果現在我需要增加乙個對於看見「小強」的態度,就只需要增加乙個visitor_action的子類,不需要改動其他類的任何**。滿足ocp原則。

visitor模式可以使得element在不修改自己的同時增加新的操作,但是這也帶來了至少以下的兩個顯著問題:

1) 破壞了封裝性。visitor模式要求visitor可以從外部修改element物件的狀態,這一般通過兩個方式來實現:a)element提供足夠的public介面,使得visitor可以通過呼叫這些介面達到修改element狀態的目的;b)element暴露更多的細節給visitor,或者讓element提供public的實現給visitor(當然也給了系統中其他的物件),或者將visitor宣告為element的friend類,僅將細節暴露給visitor。但是無論那種情況,特別是後者都將是破壞了封裝性原則(實際上就是c++的friend機制得到了很多的物件導向專家的詬病)。

2) concreteelement的擴充套件很困難:每增加乙個element的子類,就要修改visitor的

介面,使得可以提供給這個新增加的子類的訪問機制。從上面我們可以看到,或者增加乙個用於處理新增類的visit()介面,或者過載乙個處理新增類的visit()操作,或者要修改rtti方式實現的visit()實現。無論那種方式都給擴充套件新的element子類帶來了困難。

Visitor(訪問者模式)

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

訪問者模式(Visitor)

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

訪問者模式 Visitor

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