VisitorMode.h
#pragma once
#include<list>
#include<string>
#include<iostream>
using namespace std;
/*
设计模式-访问者模式(Visitor)
表示一个作用于某对象机构中各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于
这些元素的新操作。
*/
class CConcreteElementA;
class CConcreteElementB;
class CVisitor {//为该对象结构中ConcreteElement的每个类声明一个Visit操作。
public:
virtual void VisitConcreteElementA(CConcreteElementA * pConcreteElementA) = 0;
virtual void VisitConcreteElementB(CConcreteElementB * pConcreteElementB) = 0;
};
class ConcreteVisitor1 :public CVisitor {//具体访问者类
public:
void VisitConcreteElementA(CConcreteElementA * pConcreteElementA);
void VisitConcreteElementB(CConcreteElementB * pConcreteElementB);
};
class ConcreteVisitor2 :public CVisitor {//具体访问者类
public:
void VisitConcreteElementA(CConcreteElementA * pConcreteElementA);
void VisitConcreteElementB(CConcreteElementB * pConcreteElementB);
};
class CElement {//定义一个Accept操作,它以一个访问者为参数
public:
virtual void Accept(CVisitor *pVisitor) = 0;
};
class CConcreteElementA :public CElement {
private:
string mstrName;
public:
CConcreteElementA(const string &strName);
void Accept(CVisitor *pVisitor);
void OperationA() {}//A的单独方法
string GetName();
};
class CConcreteElementB :public CElement {
private:
string mstrName;
public:
CConcreteElementB(const string &strName);
void Accept(CVisitor *pVisitor);
void OperationB() {}//B的单独方法
string GetName();
};
class CobjuctStructure {//定义一个高层接口,以允许访问者访问它的元素。
private:
list<CElement*>mlElement;
public:
CobjuctStructure();
~CobjuctStructure();
void Attach(CElement *pElement);
void Eetach(CElement *pElement);
void Accept(CVisitor *pVisitor);
};
VisitorMode.cpp
#include "stdafx.h"
#include "VisitorMode.h"
void ConcreteVisitor1::VisitConcreteElementA(CConcreteElementA * pConcreteElementA) {
cout << "1-A:" << pConcreteElementA->GetName() << endl;
}
void ConcreteVisitor1::VisitConcreteElementB(CConcreteElementB * pConcreteElementB) {
cout << "1-B:" << pConcreteElementB->GetName() << endl;
}
void ConcreteVisitor2::VisitConcreteElementA(CConcreteElementA * pConcreteElementA) {
cout << "2-A:" << pConcreteElementA->GetName() << endl;
}
void ConcreteVisitor2::VisitConcreteElementB(CConcreteElementB * pConcreteElementB) {
cout << "2-B:" << pConcreteElementB->GetName() << endl;
}
CConcreteElementA::CConcreteElementA(const string &strName) {
mstrName = strName;
}
void CConcreteElementA::Accept(CVisitor *pVisitor) {
pVisitor->VisitConcreteElementA(this);
}
string CConcreteElementA::GetName() {
return mstrName;
}
CConcreteElementB::CConcreteElementB(const string &strName) {
mstrName = strName;
}
void CConcreteElementB::Accept(CVisitor *pVisitor) {
pVisitor->VisitConcreteElementB(this);
}
string CConcreteElementB::GetName() {
return mstrName;
}
CobjuctStructure::CobjuctStructure() {
mlElement.clear();
}
CobjuctStructure::~CobjuctStructure() {
for each(CElement* index in mlElement) {
delete index;
}
}
void CobjuctStructure::Attach(CElement *pElement) {
mlElement.push_back(pElement);
}
void CobjuctStructure::Eetach(CElement *pElement) {
mlElement.remove(pElement);
}
void CobjuctStructure::Accept(CVisitor *pVisitor) {
for each (CElement * index in mlElement) {
index->Accept(pVisitor);
}
}
客户端调用
#include<string>
#include<iostream>
#include "VisitorMode.h"
using namespace std;
int main() {
CobjuctStructure *pO = new CobjuctStructure();
pO->Attach(new CConcreteElementA("man"));
pO->Attach(new CConcreteElementB("woman"));
ConcreteVisitor1 *pV1 = new ConcreteVisitor1();
ConcreteVisitor2 *pV2 = new ConcreteVisitor2();
pO->Accept(pV1);
pO->Accept(pV2);
delete pO, delete pV1, delete pV2;
getchar();
return 0;
}