我正在使用策略设计模式在我几个月来编写的应用程序中执行保存/加载......
最后我想出了
随后,我创建了几个具体策略,因此诞生了 ArrayXmlWriter 和 GraphXmlWriter ,它们专门用于将数组和图形数据保存到XML文件中。现在让我们看看下面的代码片段然后我会问我的问题。
// somewhere in ArrayXmlWriter
for(ArrayItem *item : array->items()) {
// first write ModelItem attributes to a stream
stream.writeAttribute("value", item->value());
stream.writeAttribute("brushColor", QVariant(item->brushColor()).toString());
stream.writeAttribute("fontFamily", item->fontFamily());
...
// then write ModelShapedItem attributes to a stream
stream.writeAttribute("kind", QVariant(item->shapeKind()).toString());
stream.writeAttribute("rounded", QVariant(item->isRounded()).toString());
...
// ArrayItem has no specific attributes
}
事实上,ArrayItem继承自继承自ModelItem的ModelShapedItem: ModelItem< - ModelShapedItem< - ArrayItem 。
现在让我们看看第二个片段:
// somewhere in GraphXmlWriter
for(GraphVertex *vertex: graph->vertices()) {
// first write ModelItem attributes to a stream
same code as above
// then write ModelShapedItem attributes to a stream
same code as above
// ModelNode has no specific attributes
// then write GraphVertex attributes to a stream
write successors to the stream
}
以下是涉及GraphVertex类的层次结构: ModelItem< - ModelShapedItem< - ModelNode< - GraphVertex 。
现在我的问题是:
有没有办法避免重复代码(如上所示)?实际上,实现这一目的的一种方法是添加一个虚函数(将流作为参数)添加到ModelItem类。然后我们可以在子类中覆盖该函数。这意味着如果有一天要创建 GraphJsonWriter ,还会编辑ModelItem类及其涉及的子类(因为应该添加另一个虚函数)。
现在让我们想象上面显示的类,但具体策略是我动态链接到的某些库的一部分:这意味着我无法访问他们的代码。 如何在不使用dynamic_cast的情况下避免代码重复?
我不确定我是否在正确的论坛上发帖。如果我不是,请随时告诉我哪个论坛最适合我。我其实想知道是否有办法实现我想做的事情。
谢谢,对不起,如果我的英语不太好。