您好,登錄后才能下訂單哦!
Visitor.h文件內(nèi)容如下:
訪問者和元素之間互以對方為參數(shù)
#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: //實(shí)現(xiàn)訪問接口,參數(shù)為元素,在類外面實(shí)現(xiàn)函數(shù)體 virtual void Visit(Element *e); }; //具體訪問者B class VisitorTwo : public Visitor { public: //實(shí)現(xiàn)訪問接口,參數(shù)為元素,在類外面實(shí)現(xiàn)函數(shù)體 virtual void Visit(Element *e); }; //========================================================= //Element類 class Element { public: virtual void Accept(Visitor *v) { v->Visit(this);//調(diào)用訪問者接口 } char* GetName() { return (char*)m_name.c_str(); } public: //類中待訪問的元素 string m_name; }; //具有個性數(shù)據(jù)的元素 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) { //獲取元素中的數(shù)據(jù) char * data = e->GetName(); char szTemp[] = "正在處理數(shù)據(jù):"; strcat(szTemp,data); char szTip[] = "第一個訪問者"; MessageBox(0,+szTemp,szTip,0); } //訪問者類two對元素的處理方法 void VisitorTwo::Visit(Element *e) { //獲取元素中的數(shù)據(jù) char * data = e->GetName(); char szTemp[] = "正在處理數(shù)據(jù):"; strcat(szTemp,data); char szTip[] = "第二個訪問者"; MessageBox(0,+szTemp,szTip,0); } #endif
調(diào)用方法如下:
ElementA ea("元素A"); ElementB eb("元素B"); VisitorOne va; VisitorTwo vb; // 雙分派,“接受者”和“訪問者”決定了一個操作 ea.Accept(&va); ea.Accept(&vb); eb.Accept(&va); eb.Accept(&vb);
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。