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(可能是Singleton的Factory模式),它维护着不同格式的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)