// Visitor.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
class Visitor;
class Element
{
public:
virtual ~Element(){}
virtual void Accept(Visitor &rVisitor) = 0;
protected:
Element(){}
};
class ConcreateElementA
: public Element
{
public:
ConcreateElementA(string s):state_A(s)
{
}
virtual ~ConcreateElementA() {}
virtual void Accept(Visitor &rVisitor);
string getState()
{
return state_A;
}
private:
string state_A;
};
class ConcreateElementB
: public Element
{
public:
ConcreateElementB(string s): state_B(s)
{
}
virtual void Accept(Visitor &rVisitor);
string getState()
{
return state_B;
}
private:
string state_B;
};
class Visitor
{
public:
virtual ~Visitor(){}
virtual void VisitConcreateElementA(ConcreateElementA *pConcreateElementA) = 0;
virtual void VisitConcreateElementB(ConcreateElementB *pConcreateElementB) = 0;
protected:
Visitor(){}
};
class ConcreateVisitorA
: public Visitor
{
public:
virtual ~ConcreateVisitorA(){}
virtual void VisitConcreateElementA(ConcreateElementA *pConcreateElementA)
{
cout<<"+++++"<<pConcreateElementA->getState()<<"+++++"<<endl;
}
virtual void VisitConcreateElementB(ConcreateElementB *pConcreateElementB)
{
cout<<"-----"<<pConcreateElementB->getState()<<"-----"<<endl;
}
};
class ConcreateVisitorB
: public Visitor
{
public:
virtual ~ConcreateVisitorB(){}
virtual void VisitConcreateElementA(ConcreateElementA *pConcreateElementA)
{
cout<<"@@@@@"<<pConcreateElementA->getState()+""<<"@@@@@"<<endl;
}
virtual void VisitConcreateElementB(ConcreateElementB *pConcreateElementB)
{
cout<<"#####"<<pConcreateElementB->getState()<<"#####"<<endl;
}
};
void ConcreateElementA::Accept(Visitor &rVisitor)
{
rVisitor.VisitConcreateElementA(this);
}
void ConcreateElementB::Accept(Visitor &rVisitor)
{
rVisitor.VisitConcreateElementB(this);
}
int _tmain(int argc, _TCHAR* argv[])
{
Visitor *pVisitorA = new ConcreateVisitorA();
Visitor *pVisitorB= new ConcreateVisitorB();
Element *pElement = new ConcreateElementA(string("XXXXX"));
pElement->Accept(*pVisitorA);
pElement->Accept(*pVisitorB);
Element *pElement2 = new ConcreateElementB(string("YYYYY"));
pElement2->Accept(*pVisitorA);
pElement2->Accept(*pVisitorB);
delete pElement;
delete pElement2;
delete pVisitorA;
delete pVisitorB;
return 0;
}
原文链接: https://www.cnblogs.com/ustc11wj/archive/2011/06/03/2610896.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/26683
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!