मैं उन प्रारूपों से परिचित नहीं हूं लेकिन मैं एक साधारण डेटा स्थानांतरण ऑब्जेक्ट तैयार करूंगा जो आपके जीनेरिक कैलेंडर ईवेंट ऑब्जेक्ट का प्रतिनिधित्व करता है। यह डेटा (स्यूडोकोड) पकड़े लेकिन कुछ नहीं करता है:
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 CalendarEvent
{
DateTime Date { get; }
string Title { get; }
string Description { get; }
}
तो फिर तुम CalendarEventReader और CalendarEventWriter के लिए एक इंटरफेस बनाने (यह रणनीति पैटर्न और शायद बिल्डर पैटर्न, एक तरह से है)
फिर वास्तविक कार्यान्वयन उपर्युक्त इंटरफेस को लागू करते हैं। प्रत्येक प्रारूप के लिए एक।
class CalDavConverter : ICalenderEventWriter, ICalendarEventReader
{
...
}
फिर आप एक भंडार होगा (यह फैक्टरीसिंगलटन साथ पैटर्न शायद है) कि ICalenderEventReader/लेखक कार्यान्वयन की एक सूची रखता: तुम भी एक ही कक्षा में पाठक और लेखक होने के बारे में सोच सकते हैं विभिन्न स्वरूपों के लिए: (आपके मामले में कैलेंडर प्रोटोकॉल) कई कार्यान्वयन की व्यवस्था करने के
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। – Tanmay
जिस समाधान का मैं अपने साथ आया था वह समान था (फैक्ट्री भाग से कम)। क्लाइंट कोड तब कैसा दिखता है? क्या कैलेंडर ऑब्जेक्ट उस फैक्ट्री का उपयोग करेगा, या क्लाइंट कोड इसका उपयोग करेगा? –