一道考验你设计能力的C++编程题 (四)

2014-11-24 11:58:28 · 作者: · 浏览: 4
ic_Frame& pic);
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