Visitor模式示例(使用Loki类库)

王朝other·作者佚名  2006-01-09
宽屏版  字体: |||超大  

#include <iostream>

using namespace std;

class Element;

class ElementA;

class ElementB;

#define USE_LOKI

#ifndef USE_LOKI

// class Visitor

class Visitor

{

public:

virtual void VisitElementA(ElementA&) = 0 ;

virtual void VisitElementB(ElementB&) = 0 ;

} ;

// class Visitor1

class Visitor1 : public Visitor

{

public:

virtual void VisitElementA(ElementA& pA) { cout << "Visitor1::VisitElementA" << endl; }

virtual void VisitElementB(ElementB& pB) { cout << "Visitor1::VisitElementB" << endl; }

} ;

// class Visitor2

class Visitor2 : public Visitor

{

public:

virtual void VisitElementA(ElementA& pA) { cout << "Visitor2::VisitElementA" << endl; }

virtual void VisitElementB(ElementB& pB) { cout << "Visitor2::VisitElementB" << endl; }

} ;

// class Element

class Element

{

public:

virtual void Accept(Visitor&) = 0 ;

} ;

// class ElementA

class ElementA : public Element

{

public:

virtual void Accept(Visitor& v) { v.VisitElementA(*this) ; }

} ;

// class ElementB

class ElementB : public Element

{

public:

virtual void Accept(Visitor& v) { v.VisitElementB(*this) ; }

} ;

#else

#include "Visitor.h"

using namespace Loki;

typedef CyclicVisitor<void, TYPELIST_3(Element, ElementA, ElementB)> MyVisitor;

// class Visitor1

class Visitor1 : public MyVisitor

{

public:

virtual void Visit(Element&) {}

virtual void Visit(ElementA& pA) { cout << "Visitor1::VisitElementA" << endl; }

virtual void Visit(ElementB& pB) { cout << "Visitor1::VisitElementB" << endl; }

} ;

// class Visitor2

class Visitor2 : public MyVisitor

{

public:

virtual void Visit(Element&) {}

virtual void Visit(ElementA& pA) { cout << "Visitor2::VisitElementA" << endl; }

virtual void Visit(ElementB& pB) { cout << "Visitor2::VisitElementB" << endl; }

} ;

// class Element

class Element

{

public:

virtual void Accept(MyVisitor&) = 0;

};

// class ElementA

class ElementA : public Element

{

public:

DEFINE_CYCLIC_VISITABLE(MyVisitor);

} ;

// class ElementB

class ElementB : public Element

{

public:

DEFINE_CYCLIC_VISITABLE(MyVisitor);

};

#endif

int main()

{

Visitor1 v1 ; //算法1

Visitor2 v2 ; //算法2

ElementA e1 ; //对象1

ElementB e2 ; //对象2

e1.Accept(v1) ; //对象1 + 算法1

e1.Accept(v2) ; //对象1 + 算法2

e2.Accept(v1) ; //对象2 + 算法1

e2.Accept(v2) ; //对象2 + 算法2

}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有