我目前正在研究一种“保存”机制,该机制允许用户将他正在处理的项目保存在硬盘上。输出将是一个包含各种数据的XML文件。
现在我们的项目结构即将更改,我们需要编写一个新的xml文件(创建一个新的save方法)。
因此,现在面临的挑战是:保存时,我希望用户能够选择要创建的文件格式(版本1(旧)或版本2(新))。
现在有人有办法实现这一目标吗?周围是否有合适的设计模式?
备注:
-我们保存的数据可以看作是不相关的块,因此实际上很容易用新块交换旧块。
-事情的整个目标是,在加载旧项目时,它应该再次可读。 (我假设这可以通过标签完成,并且在加载时仅对标签使用react?)

最佳答案

这听起来像是Strategy模式的一个很好的应用程序。

您将使用两个虚函数FileFormatprojectToXml创建一个抽象基类xmlToProject(策略接口(interface)),这两个虚函数会将您的内部项目表示形式转换为XML,反之亦然。

然后,创建两个实现的子类FileFormatNewFileFormatLegacy(这些是具体策略)。

然后,您的保存函数将另外需要FileFormat的实例,并调用该对象的相应方法进行数据转换。您的加载函数可以通过检查XML树中是否有什么东西来告诉它是哪个版本,从而选择要使用的策略。

而且,当您需要支持其他文件格式时,只需创建一个新类,它是FileFormat的子类。

交换意见后的附录

当您将要拥有很多版本且差异很小并且仍然要使用策略模式时,可以使FileFormat包含多种策略的组合:CircleStragegy,RectangleStrategy,LineStrategy等。在这种情况下,我对于不同版本的FileFormat不会使用不同的类。我将为每个版本创建一个静态工厂函数,该函数将返回一个FileFormat以及该版本中使用的Strategy对象。

FileFormat FileFormat::createVersion1_0() {
    return new FileFormat(
        new LineStrategyOld(),
        new CircleStrategyOld(),
        new RectangleStragegyOld()
    );
}

FileFormat FileFormat::createVersion1_1() {
    // the 1.1 version introduced the new way to save lines
    return new FileFormat(
        new LineStrategyNew(),
        new CircleStrategyOld(),
        new RectangleStragegyOld()
    );
}

FileFormat FileFormat::createVersion1_2() {
    // 1.2 uses the new format to save circles
    return new FileFormat(
        new LineStrategyNew(),
        new CircleStrategyNew(),
        new RectangleStragegyOld()
    );
}

FileFormat FileFormat::createVersion1_3() {
    // 1.3 uses a new format to save rectangles, but we realized that
    // the new way to save lines wasn't that good after all, so we
    // returned to the old way.
    return new FileFormat(
        new LineStrategyOld(),
        new CircleStrategyNew(),
        new RectangleStragegyNew()
    );
}

注意:在实际代码中,对于策略类名称,您当然会使用比“Old”和“New”更多的描述性后缀。

08-06 21:30