2009-11-17 32 views
12

Takvim etkinlik nesnesim var. CalDAV/iCal/vCal protokolleri/dosya formatları ile uyumlu hale getirmeyi planlıyorum, bu da olayın seri hale getirilmesini ve farklı formatlardan seri hale getirilmesini gerektiriyor.İçe aktarma/dışa aktarma için hangi desen desenini kullanmalıyım?

Ben vs. bir ImportICal, ExportICal, ImportVCal, ExportVCal, yöntemlerin seti yazabilirim ama vCal biçimini güncellenir ne olur, vs.

Has çünkü, çok iyi bir yaklaşım gibi görünmüyor Bu tür bir ithalat/ihracat durumuyla ilgilenen var mı? Eğer öyleyse, hangi tasarım deseni (varsa) genellikle en iyisidir?

Yardımlarınız için teşekkürler!

cevap

19

Özellikle bu biçimlere aşina değilim, ancak genel takvim etkinliğinizi temsil eden basit bir veri aktarım nesnesi oluşturabilirim. O (sözde kod) verilerini tutan başka bir şey yapar:

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; } 
} 

Sonra CalendarEventReader ve CalendarEventWriter için bir arayüz oluşturmak (bu Strateji desen ve belki Oluşturucu desen, çeşit var)

Daha sonra, yukarıdaki uygulamalar, gerçek arayüzleri uygular. Her format için bir tane.

class CalDavConverter : ICalenderEventWriter, ICalendarEventReader 
{ 
    ... 
} 

Ardından (o Singleton ile belki Fabrika desen var) bir Deposu olurdu ICalenderEventReader/Yazar uygulamalarının listesini tutar: Hatta aynı sınıfta okuyucu ve yazar olan düşünebildiğim farklı biçimleri için: (sizin durumunuzda takvim protokolleri) birden çok uygulamaları düzenlemek için

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*/) 
    { 
    ... 
    } 
} 
+3

Okuyucu yazıcı arayüzlerinin oluşturucu olarak adlandırılabileceğini sanmıyorum. Ama bunun dışında, iyi bir tasarım önerisi için +1. – Tanmay

+0

Kendi başıma bulduğum çözüm benzerdi (eksi fabrika kısmı). Müşteri kodu neye benziyordu? Takvim nesnesi bu fabrikayı kullanır mı yoksa istemci kodu kullanır mı? –

0

Eğer vCal formatı güncellenirse, yazdığınız herhangi bir kodu (hangi yükseltmeler yapıldığı ASN.1 gibi bir şeye geçmeye karar vermedikçe) hangi yazım kodunu kullanırsanız değiştirmelisiniz.

İçe aktarma ve dışa aktarma yöntemleriyle bir biçim arabirimi ve olasılıkla XML'in rastgele bir bitinin bu biçim olup olmadığının sınanması için meta veriler ve yöntemler oluşturabilirim. Sonra her bir farklı format için, o arayüzü uygulayan bir nesneye sahip olursunuz. Bu bir çeşit 'strateji tasarım deseni', ancak her format, ayrı strateji objeleri olmaktan ziyade, bir şeyleri (içe aktarma, dışa aktarma, algılama) birleştirmek için çeşitli stratejileri temsil eder.

0

Olağan şekilde tek bir ortak arayüz ile Bridge Pattern olduğunu.

+0

Bu, ICalExporter uygulamasının CalendarEvent nesnesinin yapıcısına geçeceğimi gösterirdi. Ardından, CalendarEvent nesnesinde, Export() öğesini ararım ve bu olayı herhangi bir formata aktarmak için bu ICalExporter nesnesini kullanır. Her iki formatta ihtiyacım olursa ne olur? –

+0

Bunun için kompozit modeli kullanabilirsiniz – jimkont

İlgili konular