C ++设计模式策略 - 保存/加载

时间:2017-01-31 13:05:29

标签: c++ design-patterns

[1/2]上下文

我正在使用策略设计模式在我几个月来编写的应用程序中执行保存/加载......

最后我想出了

  • 模型(由数组图表等分类)
  • 两个抽象I / O类 ModelReader ModelWriter ,它们是可用于执行加载/保存的策略。

随后,我创建了几个具体策略,因此诞生了 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

现在我的问题是:

[2/2]问题

有没有办法避免重复代码(如上所示)?实际上,实现这一目的的一种方法是添加一个虚函数(将流作为参数)添加到ModelItem类。然后我们可以在子类中覆盖该函数。这意味着如果有一天要创建 GraphJsonWriter ,还会编辑ModelItem类及其涉及的子类(因为应该添加另一个虚函数)。

现在让我们想象上面显示的类,但具体策略是我动态链接到的某些库的一部分:这意味着我无法访问他们的代码。 如何在不使用dynamic_cast的情况下避免代码重复?

我不确定我是否在正确的论坛上发帖。如果我不是,请随时告诉我哪个论坛最适合我。我其实想知道是否有办法实现我想做的事情。

谢谢,对不起,如果我的英语不太好。

0 个答案:

没有答案