C++访问者模式
Visitor.h文件内容如下:
访问者和元素之间互以对方为参数
#ifndef__VISITOR__#define__VISITOR__#include<iostream>#include<string>#include<vcl.h>usingnamespacestd;classElement;///访问者接口类classVisitor{public:virtualvoidVisit(Element*e)=0;};//具体访问者AclassVisitorOne:publicVisitor{public://实现访问接口,参数为元素,在类外面实现函数体virtualvoidVisit(Element*e);};//具体访问者BclassVisitorTwo:publicVisitor{public://实现访问接口,参数为元素,在类外面实现函数体virtualvoidVisit(Element*e);};//=========================================================//Element类classElement{public:virtualvoidAccept(Visitor*v){v->Visit(this);//调用访问者接口}char*GetName(){return(char*)m_name.c_str();}public://类中待访问的元素stringm_name;};//具有个性数据的元素classElementA:publicElement{public:ElementA(strings){m_name=s;//传入父类成员m_name中}};classElementB:publicElement{public:ElementB(strings){m_name=s;}};//=========================================================//访问者类one对元素处理方法(须声明到Element类的后面否则编译不能通过)voidVisitorOne::Visit(Element*e){//获取元素中的数据char*data=e->GetName();charszTemp[]="正在处理数据:";strcat(szTemp,data);charszTip[]="第一个访问者";MessageBox(0,+szTemp,szTip,0);}//访问者类two对元素的处理方法voidVisitorTwo::Visit(Element*e){//获取元素中的数据char*data=e->GetName();charszTemp[]="正在处理数据:";strcat(szTemp,data);charszTip[]="第二个访问者";MessageBox(0,+szTemp,szTip,0);}#endif
调用方法如下:
ElementAea("元素A");ElementBeb("元素B");VisitorOneva;VisitorTwovb;//双分派,“接受者”和“访问者”决定了一个操作ea.Accept(&va);ea.Accept(&vb);eb.Accept(&va);eb.Accept(&vb);
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。