#include <iostream>
#include <vector> using namespace std; #define DESTROY_POINTER(ptr) if (ptr) { delete ptr; ptr = NULL; } class Element; class Visitor
{
public:
virtual void Visit(Element* pElement)=;
}; class ConcreteVisitorA : public Visitor
{
public:
void Visit(Element* pElement);
}; class ConcreteVisitorB : public Visitor
{
public:
void Visit(Element* pElement);
}; class Element
{
public:
virtual void Accept(Visitor* pVisitor)=;
virtual void Interface1()=;
virtual void Interface2()=;
}; class ConcreteElementA : public Element
{
public:
void Accept(Visitor* pVisitor)
{
pVisitor->Visit(this);
}
void Interface1() { cout<<"ConcreteElementA::Interface1"<<endl; }
void Interface2() { cout<<"ConcreteElementA::Interface2"<<endl; }
}; class ConcreteElementB : public Element
{
public:
void Accept(Visitor* pVisitor)
{
pVisitor->Visit(this);
}
void Interface1() { cout<<"ConcreteElementB::Interface1"<<endl; }
void Interface2() { cout<<"ConcreteElementB::Interface2"<<endl; }
}; void ConcreteVisitorA::Visit(Element* pElement)
{
pElement->Interface1();
} void ConcreteVisitorB::Visit(Element* pElement)
{
pElement->Interface2();
} class Structure
{
public:
virtual ~Structure()
{
for (unsigned int i = ; i < m_elementList.size(); i++)
{
delete m_elementList[i];
}
m_elementList.clear();
} void Accept(Visitor* pVisitor)
{
for (unsigned int i = ; i < m_elementList.size(); i++)
{
m_elementList[i]->Accept(pVisitor);
}
} void AddElement(Element* pElement)
{
m_elementList.push_back(pElement);
}
private:
vector<Element*> m_elementList;
}; int main(int argc, char *argv[])
{
Structure structure; structure.AddElement(new ConcreteElementA);
structure.AddElement(new ConcreteElementB); Visitor* pVisitorA = new ConcreteVisitorA;
Visitor* pVisitorB = new ConcreteVisitorB; structure.Accept(pVisitorA);
structure.Accept(pVisitorB); DESTROY_POINTER(pVisitorA);
DESTROY_POINTER(pVisitorB); return ;
}

最新文章

  1. 【转】 Camera模仿3D效果的小例子(图片无限旋转)
  2. Monkey的ADB命令简单使用示例和解析
  3. react验证码倒计时
  4. tomcat报错
  5. pylab模式
  6. linux 缺少动态连接库.so--cannot open shared object file: No such file or directory
  7. HDU 4712:Hamming Distance
  8. 理解EnterCriticalSection 临界区
  9. 矩形嵌套 南阳理工ACM
  10. Android Failure [INSTALL_FAILED_OLDER_SDK]
  11. ORA-04021
  12. 第25篇 jQuer快速学习(上)---选择器和DOM操作
  13. 浅析Java中synchronized与static synchronized
  14. HDU 2544 最短路(模板题——Floyd算法)
  15. CFS调度器(1)-基本原理
  16. LINUX-redis &amp; mongodb
  17. 跟着未名学Office – 整体了解 Ms Office 2010
  18. Django Rest Framework源码剖析(六)-----序列化(serializers)
  19. 004.KVM日常管理1
  20. consul读取key value

热门文章

  1. Task.Run Vs Task.Factory.StartNew z
  2. Salted Password Hashing
  3. C++开源hash项目sparsehash
  4. substr
  5. Linux文件夹文件创建、删除
  6. spring listener引用spring中bean
  7. Android SDK Manager 设置代理
  8. 网络编程socket
  9. dwr NoSuchBeanDefinitionException
  10. ubuntu搭建分布式hadoop-2.6.0概略和错误