Ответ 1
Я не особенно знаком с этими форматами, но я бы создал простой объект передачи данных, который представляет ваш общий объект событий календаря. Он ничего не делает, кроме хранения данных (псевдокод):
class CalendarEvent
{
DateTime Date { get; }
string Title { get; }
string Description { get; }
}
Затем вы создаете интерфейс для 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);
}
Затем реалистичные реализации реализуют указанные выше интерфейсы. Один для каждого формата. Вы даже можете думать о том, что читатель и писатель в одном классе:
class CalDavConverter : ICalenderEventWriter, ICalendarEventReader
{
...
}
У вас тогда будет репозиторий (это шаблон 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*/)
{
...
}
}