2011-01-25 12 views
8

Per coloro che hanno familiarità con il modello di mediatore ...Attuazione del modello di mediatore in Delphi senza ottenere i riferimenti circolari

Voglio realizzare il modello di mediatore in Delphi, ma il compilatore Delphi non può gestire i riferimenti circolari necessario.

Guardando il diagramma GOF originale da "Modelli di progettazione", il Mediatore ha un riferimento a ciascun collega, ma molti degli oggetti del collega hanno un riferimento al Mediatore.

questo non è un problema nella maggior parte delle lingue, ma il mio compilatore Delphi mi sta dando 'F2047 unità circolare riferimento a ...'

Sarebbe this approach, utilizzando interfacce, essere qualsiasi uso? (Sembra complicato)

Sto usando Delphi 2010

[Sintesi soluzione]

Giusto per riassumere la risposta accettata: In lingue che permettono i riferimenti circolari, è possibile omettere la classe mediatore astratta (come descritto nella sezione "Implementazione" di GoF a pagina 278). L'unico modo per implementare Mediator in Delphi senza una classe di mediatore astratta è di avere tutte le classi in una sola unità.

In caso contrario, è necessaria una classe di base Mediator extra in aggiunta alla sottoclasse di calcestruzzo.

vostri clausole usi per le tre Unità sarebbe simile a questa:

ConcreteColleage1 Usi mediatore
ConcreteMediator Usi mediatore, ConcreateColleague1
Mediator (Non utilizzare uno)

Nessun riferimenti circolari!

risposta

5

Non vedo dove sorgono le dipendenze circolari. Se implementi le tue lezioni dopo il this diagram, non dovrebbe accadere nulla del genere.

Per attuare questo diagramma a Delfi, sarete davvero bisogno di scrivere

  • sia un'interfaccia Mediator (ed avere la vostra classe ConcreteMediator implementare questa interfaccia)
  • o una classe base Mediator con metodi virtuali, (e avere la tua classe ConcreteMediator derivare da Mediator e sovrascrivere questi metodi).
+0

Mi riferisco allo schema del Mediatore come descritto nel libro Design Patterns di GoF. Nello specifico, il diagramma a pagina 274. 'aButton' ha un riferimento a 'aFontDialogDirector' e viceversa 'aFontDialogDirector' ha un riferimento a 'aButton'. Quindi in Delphi, queste due classi devono essere nella stessa unità. – awmross

+0

Dopo aver letto la tua risposta con più attenzione, ora vedo che è giusto. Devo creare una classe Mediator di base in un'unità e sottoclassi in un'altra unità. Se modifichi la tua risposta posso cambiare il mio downvote a un upvote :-) – awmross

7

L'utilizzo delle interfacce può certamente aiutare a ridurre le dipendenze tra le unità. Un altro approccio consiste nell'avere classi di base astratte che definiscono i metodi di interazione tra le classi e quindi mettono discendenti concreti in unità separate.

Vedere: How to avoid circular unit reference? per ulteriori informazioni su come evitare i riferimenti circolari in Delphi.

2

Un'altra opzione da considerare è l'inserimento di Mediatore e Collega nella stessa unità. In molte situazioni questo è il modo idiomatico di Delphi per evitare riferimenti circolari.

L'utilizzo di interfaces è spesso un buon approccio a questo tipo di problema, ma a volte può comportare una complessità extra senza un reale guadagno.

È difficile sapere dove i contrasti cadranno per il tuo codice, quindi non vorrei affermare che un approccio sia migliore dell'altro come regola generale.

+0

Poiché sto cercando di suddividere un file di 5000 righe, mantenere le classi nella stessa unità non mi aiuta molto. Ma in altre situazioni questa sarebbe una possibile soluzione. – awmross

+2

@awmross 5000 linee ?! Non è niente, il mio più grande ha 32.000 linee. Più seriamente, spaccare file di grandi dimensioni è spesso una buona idea, ma arriva sempre un punto in cui peggiora le cose mantenendo le cose strettamente correlate l'una dall'altra. Ad ogni modo, sono sicuro che tu lo sappia bene. –