Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/425.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 导入/导出时应使用什么设计模式?_Design Patterns_Oop - Fatal编程技术网

Design patterns 导入/导出时应使用什么设计模式?

Design patterns 导入/导出时应使用什么设计模式?,design-patterns,oop,Design Patterns,Oop,我有一个日历事件对象。我计划使其与CalDAV/iCal/vCal协议/文件格式兼容,这些协议/文件格式要求在不同格式之间对事件进行序列化和反序列化 我可以编写importial、exportial、ImportVCal、ExportVCal等一组方法,但这似乎不是一个很好的方法,因为如果vCal格式被更新了怎么办 以前有没有人处理过这种进出口情况?如果是的话,什么设计模式(如果有的话)通常是最好的 谢谢你的帮助 如果vCal格式被更新,您将不得不更改您编写的任何代码,无论您使用的是哪种设计模式

我有一个日历事件对象。我计划使其与CalDAV/iCal/vCal协议/文件格式兼容,这些协议/文件格式要求在不同格式之间对事件进行序列化和反序列化

我可以编写importial、exportial、ImportVCal、ExportVCal等一组方法,但这似乎不是一个很好的方法,因为如果vCal格式被更新了怎么办

以前有没有人处理过这种进出口情况?如果是的话,什么设计模式(如果有的话)通常是最好的


谢谢你的帮助

如果vCal格式被更新,您将不得不更改您编写的任何代码,无论您使用的是哪种设计模式(除非他们决定切换到类似ASN.1的版本,在该版本中会进行升级)


我将创建一个带有导入和导出方法的格式接口,可能还有元数据和方法,用于测试XML的随机位是否可能是该格式。然后,对于每种不同的格式,都有一个实现该接口的对象。这是一种“策略设计模式”,但每种格式都代表了执行一组内聚的事情(导入、导出、检测)的几种策略,而不是有单独的策略对象

我对这些格式并不特别熟悉,但我会创建一个简单的数据传输对象,它表示您的genereric calendar event对象。它只保存数据(伪代码):

然后为CalendarEventReader和CalendarEventWriter创建一个界面(它是策略模式,可能是生成器模式,类似于):

然后让实际实现实现上述接口。每种格式一个。您甚至可以考虑将reader和writer放在同一个类中:

class CalDavConverter : ICalenderEventWriter, ICalendarEventReader
{
    ...
}
然后,您将拥有一个存储库(它是工厂模式,可能带有单例),用于维护不同格式的ICalenderEventReader/Writer实现列表:

static class CalenderEventConverterRepository
{
    static ICalendarEventReader GetReader(string formatName /*or any other data upon wich to decide wich format is needed*/)
    { 
    ...
    }

    static ICalendarEventReader GetWriter(string formatName /*or any other data upon wich to decide wich format is needed*/)
    { 
    ...
    }
}

用一个通用接口安排多个实现(在您的情况下是日历协议)的通常方法是。

我认为读写器接口不能称为构建器。但除此之外,+1是一个好的设计建议。我自己提出的解决方案是类似的(减去工厂部分)。那么客户端代码是什么样子的呢?calendar对象会使用该工厂,还是客户端代码会使用它?这意味着我会将ICalExporter的实现传递给CalendarEvent对象的构造函数。然后,在CalendarEvent对象上,我调用Export(),它使用ICalExporter对象将事件导出为任何格式。如果我需要这两种格式呢?你可以使用复合模式
class CalDavConverter : ICalenderEventWriter, ICalendarEventReader
{
    ...
}
static class CalenderEventConverterRepository
{
    static ICalendarEventReader GetReader(string formatName /*or any other data upon wich to decide wich format is needed*/)
    { 
    ...
    }

    static ICalendarEventReader GetWriter(string formatName /*or any other data upon wich to decide wich format is needed*/)
    { 
    ...
    }
}