访问者模式
C++
#include <iostream>
#include <list>
using namespace std;
class Visitor;
class Element
{
public:
Element(string strName) : m_strName(strName) {
}
string GetName()
{
return m_strName;
}
virtual void AcceptVisitor(Visitor *pVisitor) = 0;
private:
string m_strName;
};
class Visitor
{
public:
virtual void VisitCPU(Element *pEle) = 0;
virtual void VisitGPU(Element *pEle) = 0;
virtual void VisitDISK(Element *pEle) = 0;
};
class Computer
{
public:
~Computer()
{
for (Element *pElement : m_listEle)
{
delete pElement;
}
}
void AddElement(Element *pEle)
{
m_listEle.push_back(pEle);
}
void DelElement(Element *pEle)
{
m_listEle.remove(pEle);
}
void AcceptVisitor(Visitor *pVisitor)
{
for (Element *pElement : m_listEle)
{
pElement->AcceptVisitor(pVisitor);
}
}
private:
list<Element *> m_listEle;
};
class VisitorA : public Visitor
{
public:
void VisitCPU(Element *pEle)
{
printf("Visitor A record CPU's name:%s\n", pEle->GetName().c_str());
}
void VisitGPU(Element *pEle)
{
printf("Visitor A do nothing to GPU:%s\n", pEle->GetName().c_str());
}
void VisitDISK(Element *pEle)
{
printf("Visitor A change DISK:%s\n", pEle->GetName().<