您好,登錄后才能下訂單哦!
Visitor.h文件內容如下:
訪問者和元素之間互以對方為參數
#ifndef __VISITOR__ #define __VISITOR__ #include <iostream> #include <string> #include <vcl.h> using namespace std; class Element; ///訪問者接口類 class Visitor { public: virtual void Visit(Element *e) = 0; }; //具體訪問者A class VisitorOne : public Visitor { public: //實現訪問接口,參數為元素,在類外面實現函數體 virtual void Visit(Element *e); }; //具體訪問者B class VisitorTwo : public Visitor { public: //實現訪問接口,參數為元素,在類外面實現函數體 virtual void Visit(Element *e); }; //========================================================= //Element類 class Element { public: virtual void Accept(Visitor *v) { v->Visit(this);//調用訪問者接口 } char* GetName() { return (char*)m_name.c_str(); } public: //類中待訪問的元素 string m_name; }; //具有個性數據的元素 class ElementA: public Element { public: ElementA(string s) { m_name = s;//傳入父類成員m_name中 } }; class ElementB : public Element { public: ElementB(string s) { m_name = s; } }; //========================================================= //訪問者類one對元素處理方法(須聲明到Element類的后面否則編譯不能通過) void VisitorOne::Visit(Element *e) { //獲取元素中的數據 char * data = e->GetName(); char szTemp[] = "正在處理數據:"; strcat(szTemp,data); char szTip[] = "第一個訪問者"; MessageBox(0,+szTemp,szTip,0); } //訪問者類two對元素的處理方法 void VisitorTwo::Visit(Element *e) { //獲取元素中的數據 char * data = e->GetName(); char szTemp[] = "正在處理數據:"; strcat(szTemp,data); char szTip[] = "第二個訪問者"; MessageBox(0,+szTemp,szTip,0); } #endif
調用方法如下:
ElementA ea("元素A"); ElementB eb("元素B"); VisitorOne va; VisitorTwo vb; // 雙分派,“接受者”和“訪問者”決定了一個操作 ea.Accept(&va); ea.Accept(&vb); eb.Accept(&va); eb.Accept(&vb);
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。