Я не особенно знаком с этими форматами, но я бы создал простой объект передачи данных, который представляет ваш общий объект события календаря. Он не делает ничего, кроме хранения данных (псевдокод):
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 , возможно, с Singleton ), который поддерживает список реализаций 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*/)
{
...
}
}