visitor.h
/************************************************************************
* description: 为该对象结构中ConcreteElement的每一个类声明一个visit操作
* remark:
************************************************************************/
#ifndef _VISITOR_H_
#define _VISITOR_H_
class concreteElementA;
class concreteElementB;
class visitor
{
public:
visitor(){};
virtual ~visitor(){};
virtual void visitConcreteElementA(concreteElementA* pConcreteElementA) = 0;
virtual void visitConcreteElementB(concreteElementB* pConcreteElementB) = 0;
};
#endif// _VISITOR_H_
/************************************************************************
* description: 具体访问者,实现每个由visitor声明的操作。每个操作实现算法
的一部分,而该算法片断乃是对应于结构中对象的类
* remark:
************************************************************************/
#ifndef _CONCRETE_VISITOR_H_
#define _CONCRETE_VISITOR_H_
#include "visitor.h"
#include <iostream>
using namespace std;
class concreteVisitor1 : public visitor
{
public:
concreteVisitor1(){};
~concreteVisitor1(){};
virtual void visitConcreteElementA(concreteElementA* pConcreteElementA)
{
cout << "concreteElementA被concreteVisitor1访问" << endl;
}
virtual void visitConcreteElementB(concreteElementB* pConcreteElementB)
{
cout << "concreteElementB被concreteVisitor1访问" << endl;
}
};
class concreteVisitor2 : public visitor
{
public:
concreteVisitor2(){};
~concreteVisitor2(){};
virtual void visitConcreteElementA(concreteElementA* pConcreteElementA)
{
cout << "concreteElementA被concreteVisitor2访问" << endl;
}
virtual void visitConcreteElementB(concreteElementB* pConcreteElementB)
{
cout << "concreteElementB被concreteVisitor2访问" << endl;
}
};
#endif// _CONCRETE_VISITOR_H_
/************************************************************************
* description: 定义一个accept操作,它以一个访问者为参数
* remark:
************************************************************************/
#ifndef _ELEMENT_H_
#define _ELEMENT_H_
class visitor;
class element
{
public:
element(){};
virtual ~element(){};
virtual void accept(visitor* pVisitor) = 0;
};
#endif// _ELEMENT_H_
#ifndef _CONCRETE_ELEMENT_H_
#define _CONCRETE_ELEMENT_H_
#include "element.h"
#include <iostream>
using namespace std;
class concreteElementA : public element
{
public:
concreteElementA(){};
~concreteElementA(){};
// 充分利用双分派技术,实现处理与数据结构的分离
virtual void accept(visitor* pVisitor)
{
if (NULL != pVisitor)
{
pVisitor->visitConcreteElementA(this);
}
}
// 其他的相关方法
void operationA()
{
cout << "具体元素A的其他相关方法" << endl;
}
};
class concreteElementB : public element
{
public:
concreteElementB(){};
~concreteElementB(){};
// 充分利用双分派技术,实现处理与数据结构的分离
virtual void accept(visitor* pVisitor)
{
if (NULL != pVisitor)
{
pVisitor->visitConcreteElementB(this);
}
}
// 其他的相关方法
void operationB()
{
cout << "具体元素B的其他相关方法" << endl;
}
};
#endif// _CONCRETE_ELEMENT_H_
/************************************************************************
* description: 枚举元素,可以提供一个高层的接口以允许访问者访问它的元素
* remark:
************************************************************************/
#ifndef _OBJECT_STRUCTURE_H_
#define _OBJECT_STRUCTURE_H_
#include "element.h"
#include "visitor.h"
#include <list>
using namespace std;
class objectStructure
{
public:
void attach(element* pElement)
{
m_list.push_back(pElement);
}
void detach(element* pElement)
{
m_list.remove(pElement);
}
void accept(visitor* pVisitor)
{
list<element*>::iterator Iter;
for (Iter = m_list.begin(); Iter != m_list.end(); ++Iter)
{
if (NULL != *Iter)
{
(*Iter)->accept(pVisitor);
}
}
}
private:
list<element*> m_list;
};
#endif// _OBJECT_STRUCTURE_H_
// visitorApp.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "objectStructure.h"
#include "concreteElement.h"
#include "concreteVisitor.h"
void freePtr(void* vptr)
{
if (NULL != vptr)
{
delete vptr;
vptr = NULL;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
objectStructure* pObject = new objectStructure();
if (NULL != pObject)
{
element* pElementA = new concreteElementA();
element* pElementB = new concreteElementB();
pObject->attach(pElementA);
pObject->attach(pElementB);
concreteVisitor1* pVisitor1 = NULL;
pVisitor1 = new concreteVisitor1();
concreteVisitor2* pVisitor2 = NULL;
pVisitor2 = new concreteVisitor2();
pObject->accept(pVisitor1);
pObject->accept(pVisitor2);
system("pause");
freePtr(pVisitor2);
freePtr(pVisitor1);
freePtr(pElementB);
freePtr(pElementA);
freePtr(pObject);
}
return 0;
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有