溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C++訪問者模式

發(fā)布時間:2020-07-04 22:13:48 來源:網(wǎng)絡(luò) 閱讀:537 作者:Chinayu2014 欄目:編程語言

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);


向AI問一下細(xì)節(jié)

免責(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)容。

AI