2009-05-05 9 views
5

Appena iniziando a imparare i modelli. Ecco una semplice domanda che ho.Quale modello dovrei utilizzare per elaborare i report in un'infrastruttura per consentire varie rappresentazioni?

Ho un oggetto Report contenente Page s, ciascuna delle quali contiene vari ReportElement s (Table, Paragraph, Image) e così via. Supponiamo che io voglio creare un'infrastruttura per l'adozione di un Report e sputando varie rappresentazioni di questo Report come un documento RTF formattato, un documento TeX-formattato, un documento HTML, ecc

Quale design pattern sto cercando qui ?

risposta

10

Strategy Credo.

È possibile creare un RTFReportGenerator, un HtmlReportGenerator, ecc. Che implementano tutti la stessa interfaccia 'IReportGenerator', ma ogni classe concreta implementa il metodo 'WriteReport (Report r)' in un modo diverso.

+0

Ogni singolo "generatore" può essere un costruttore. http://en.wikipedia.org/wiki/Builder_pattern –

+0

Hmm, credo che l''oggetto' (Report) sia già stato creato; il 'Generatore' dovrebbe semplicemente 'generare' un file che contiene una rappresentazione RTF/HTML/... dell'istanza Report che è stata data. –

+0

"Il generatore dovrebbe ..." Concordato: il punto è che i disegni si annidano e si sovrappongono. Raramente c'è un singolo pattern per questo genere di cose. –

0

Non cercare il motivo concreto. Molti modelli hanno la stessa struttura ma scopi diversi. E comunque devi sempre apportare qualche cambiamento nel modello per usarlo nel tuo caso concreto. Dopo aver appreso i pattern sarai in grado di pensare correttamente agli oggetti e alla loro relazione.

È possibile utilizzare strategie per diverse rappresentazioni, è possibile utilizzare il builder per creare report.

E puoi anche usare qualcosa di più semplice. Come combinazione di delega ed ereditarietà (per me è la migliore soluzione del tuo problema). Basta creare ierarchy of Representations (BasicView < | - RTFView, TextView ...) e passare Report al costruttore BasicView. Lasciare che diverse viste forniscano una diversa trasformazione dei dati del Report originale.

1

Per un gruppo di oggetti organizzati è applicabile anche la sequenza Visitor. Questo si risolve un po 'meglio con l'attraversamento di strutture di oggetti, a seconda delle esigenze è possibile utilizzarlo per altre attività che devono gestire i report come gruppo.

0

Probabilmente utilizzerei il pattern Composite per rappresentare l'albero degli elementi del report e Visitor (come ha detto Harald) per trasformare l'oggetto del report in una specifica rappresentazione concreta.

Problemi correlati