我应该使用什么设计模式进行导入/导出?

Bra*_*ery 12 oop design-patterns

我有一个日历事件对象.我计划使其与CalDAV/iCal/vCal协议/文件格式兼容,这需要将事件序列化和反序列化为不同格式.

我可以编写一个ImportICal,ExportICal,ImportVCal,ExportVCal等方法集,但这似乎不是一个非常好的方法,因为如果更新vCal格式等等.

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

谢谢你的帮助!

bit*_*onk 19

我并不熟悉这些格式,但我创建了一个简单的数据传输对象,代表您的genereric日历事件对象.除了保存数据(伪代码)之外什么都不做:

class CalendarEvent
{
    DateTime Date { get; }
    string Title { get; }
    string Description { get; }
}
Run Code Online (Sandbox Code Playgroud)

然后为CalendarEventReader和CalendarEventWriter创建一个接口(它的策略模式,也许是Builder模式,有点):

interface ICalendarEventReader
{
     CalendarEvent Read(Stream data);
     // Add additional methods if needed e.g.:
     string GetTitleOnly(Stream data);
}
interface ICalendarEventWriter
{
     Stream Write(CalendarEvent event);
     // Add additional methods if needed e.g.:
     Stream WriteSummaryOnly(CalendarEvent event);
}
Run Code Online (Sandbox Code Playgroud)

然后让实际的实现实现上述接口.每种格式一个.你甚至可以考虑让读者和作者在同一个班级:

class CalDavConverter : ICalenderEventWriter, ICalendarEventReader
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后,您将拥有一个Repository(可能是SingletonFactory模式),它维护着不同格式的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*/)
    { 
    ...
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我不认为读者编写器接口可以称为构建器.但除此之外,+1是一个很好的设计建议. (3认同)