virtual void VisitPicVCat(CPic_VCat& pic);
virtual void VisitPicHCat(CPic_HCat& pic);
public:
std::string GetStructXMLString() { return m_strStructXML;}
protected:
std::string m_strStructXML;
};
实现也不复杂:
void CStructXMLVisitor::VisitPicString(CPic_String& pic)
{
m_strStructXML = "
int nHeight = pic.GetHeight();
for(int i=0;i
m_strStructXML += pic.GetLineData(i);
}
m_strStructXML += "
}
void CStructXMLVisitor::VisitPicFrame(CPic_Frame& pic)
{
CStructXMLVisitor v;
pic.m_pic->Accept(v);
m_strStructXML = "
m_strStructXML += v.GetStructXMLString();
m_strStructXML += "
}
void CStructXMLVisitor::VisitPicVCat(CPic_VCat& pic)
{
m_strStructXML = "
CStructXMLVisitor v1;
pic.m_pic1->Accept(v1);
m_strStructXML += v1.GetStructXMLString();
CStructXMLVisitor v2;
pic.m_pic2->Accept(v2);
m_strStructXML += v2.GetStructXMLString();
m_strStructXML += "";
}
void CStructXMLVisitor::VisitPicHCat(CPic_HCat& pic)
{
m_strStructXML = "
CStructXMLVisitor v1;
pic.m_pic1->Accept(v1);
m_strStructXML += v1.GetStructXMLString();
CStructXMLVisitor v2;
pic.m_pic2->Accept(v2);
m_strStructXML += v2.GetStructXMLString();
m_strStructXML += "";
}
然后我们在我们的CPicture界面里增加一个GetStructXMLString方法,实现也很简单:
std::string CPicture::GetStructXMLString()
{
CStructXMLVisitor v;
m_pic->Accept(v);
return v.GetStructXMLString();
}
可以看到,改用新的设计之后,以后我们再有什么新需求,只要直接增加一个Visitor就好了, 所以说设计不是一层不变的,要根据需求不停的重构。
最后贴一下类图,外部只要和CPicture打交道就可以了:
源代码下载: http://up.2cto.com/2012/0619/20120619094552671.rar
http://up.2cto.com/2012/0619/20120619094553222.rar
作者:Richard Wei