2009-11-17 20 views
12

Tôi có đối tượng sự kiện lịch. Tôi có kế hoạch để làm cho nó tương thích với các định dạng tệp/giao thức CalDAV/iCal/vCal, yêu cầu sự kiện phải được tuần tự hóa và không được tuần tự hóa sang và từ các định dạng khác nhau.Tôi nên sử dụng mẫu thiết kế nào để nhập/xuất?

tôi có thể viết một ImportICal, ExportICal, ImportVCal, ExportVCal vv thiết lập các phương pháp, nhưng điều đó không có vẻ như một cách tiếp cận rất tốt, bởi vì những gì nếu định dạng vCal được cập nhật vv

Có bất cứ ai xử lý loại tình hình xuất nhập khẩu này trước đây? Nếu vậy, mẫu thiết kế nào (nếu có) nói chung là tốt nhất?

Cảm ơn sự giúp đỡ của bạn!

Trả lời

19

Tôi không quen thuộc với các định dạng đó nhưng tôi sẽ tạo một đối tượng truyền dữ liệu đơn giản đại diện cho đối tượng sự kiện lịch chung của bạn. Nó không làm gì nhưng giữ dữ liệu (giả):

class CalendarEvent 
{ 
    DateTime Date { get; } 
    string Title { get; } 
    string Description { get; } 
} 

Rồi bạn tạo một giao diện cho CalendarEventReader và CalendarEventWriter (đó là Chiến lược mẫu và có thể Builder mẫu , loại):

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

Sau đó, thực hiện triển khai thực hiện các giao diện trên. Một cho mỗi định dạng. Bạn thậm chí có thể nghĩ về việc có người đọc và nhà văn trong cùng một lớp:

class CalDavConverter : ICalenderEventWriter, ICalendarEventReader 
{ 
    ... 
} 

Sau đó bạn muốn có một Repository (đó là Factory mẫu có thể với Singleton) duy trì một danh sách các hiện thực ICalenderEventReader/Writer đối với các định dạng khác nhau:

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

Tôi không nghĩ giao diện người đọc của người đọc có thể được gọi là người xây dựng. Nhưng ngoài ra, +1 cho một đề xuất thiết kế tốt. – Tanmay

+0

Các giải pháp tôi đã đưa ra một mình là tương tự (trừ phần nhà máy). Mã máy khách sẽ trông như thế nào? Đối tượng lịch có sử dụng nhà máy đó hay mã khách hàng sẽ sử dụng nó? –

0

Nếu định dạng vCal được cập nhật, bạn sẽ phải thay đổi bất kỳ mã nào bạn đã viết bất kể mẫu thiết kế nào bạn sử dụng (trừ khi chúng quyết định chuyển sang thứ gì đó như ASN.1, nơi nâng cấp được nướng).

Tôi sẽ tạo một giao diện định dạng với các phương thức nhập và xuất, và có thể siêu dữ liệu và phương pháp để kiểm tra xem một bit ngẫu nhiên của XML có khả năng là định dạng đó hay không. Sau đó, đối với mỗi định dạng khác nhau, bạn có một đối tượng thực hiện giao diện đó. Đây là một loại 'mẫu thiết kế chiến lược', nhưng mỗi định dạng đại diện cho một số chiến lược để thực hiện một tập hợp các thứ liên kết (nhập, xuất, phát hiện) thay vì có các đối tượng chiến lược riêng biệt.

0

Cách thông thường để sắp xếp nhiều triển khai (giao thức lịch trong trường hợp của bạn) với một giao diện chung duy nhất là Bridge Pattern.

+0

Điều này có nghĩa là tôi sẽ vượt qua việc thực thi, ví dụ, ICalExporter đối với hàm tạo của đối tượng CalendarEvent. Sau đó, trên đối tượng CalendarEvent, tôi gọi Export() và nó sử dụng đối tượng ICalExporter đó để xuất sự kiện sang bất kỳ định dạng nào. Nếu tôi cần nó ở cả hai định dạng thì sao? –

+0

Bạn có thể sử dụng mẫu tổng hợp cho – jimkont

Các vấn đề liên quan