天天看點

通路者模式

通路者模式

class Element

{

public:

Element(string str) :m_name(str) {}

virtual void accept(visitor * pVist) = 0;

string getName(void) { return m_name; }

private:

string m_name;

};

class concreteElementA : public Element

concreteElementA(string str) : Element(str) {};

void accept(visitor* pVist);

class concreteElementB : public Element

concreteElementB(string str , int number) : Element(str)

,mNumber(number){};

int getNumber(void) { return mNumber; }

int mNumber;

class visitor

virtual void visitorElementA(concreteElementA* pE) = 0;

virtual void visitorElementB(concreteElementB* pE) = 0;

class vistorA : public visitor

void visitorElementA(concreteElementA* pE)

cout << "visitor A visit name" << pE->getName().c_str()<< endl;

}

void visitorElementB(concreteElementB* pE)

cout << "visitor A visit num " << pE->getNumber()<< endl;

class vistorB : public visitor

cout << "visitor B visit name" << pE->getName().c_str() << endl;

cout << "visitor B visit num " << pE->getNumber()<< endl;

void concreteElementA::accept(visitor * pVist)

pVist->visitorElementA(this);

void concreteElementB::accept(visitor* pVist)

pVist->visitorElementB(this);

class objectStruct

list<Element* > mlist;

objectStruct() {}

~objectStruct()

for (auto it = mlist.begin(); it != mlist.end(); ++it)

delete *it;

mlist.clear();

void add(Element* pE)

mlist.push_back(pE);

void accept(visitor* pVist)

(*it)->accept(pVist);

int main()

objectStruct mObject;

visitor* pA = new vistorA();

visitor* pB = new vistorB();

mObject.add(new concreteElementA(string("EA")));

mObject.add(new concreteElementB(string("EB"),1001));

mObject.accept(pA);

mObject.accept(pB);

delete pA;

delete pB;

cin.get();