Composite



Scaricare 0.68 Mb.
Pagina1/7
03.04.2019
Dimensione del file0.68 Mb.
  1   2   3   4   5   6   7

DESIGN PATTERN




1. Composite

Supponiamo di avere un certo numero di oggetti elementari (oggetti di base) che possono essere aggregati tra loro per formare oggetti più complessi (oggetti composti). Gli oggetti composti, a loro volta, possono essere aggregati tra loro oppure con altri oggetti elementari per formare altri oggetti composti più complessi di quelli di partenza. E così via in modo ricorsivo.


Questi oggetti possono essere organizzati in modo gerarchico, nel senso che gli oggetti elementari possono essere visti come foglie della gerarchia e quelli composti possono essere visti come nodi intermedi della struttura. Esiste un oggetto composto (che nel caso limite di un solo nodo è un oggetto elementare) che è la radice della struttura gerarchica.

Esempio:
Consideriamo un Editor grafico i cui elementi base (linee, circonferenze, quadrati, …) possono essere raggruppati in «pictures».

D
ovendo disegnare (per un sistema CAD) il “lavandino” proposto in figura 1:

Figura 1 - diag01.wmf

ci si accorge che un suo possibile diagramma a istanze è il seguente:


Figura 2 - diag02.wmf


Chi usa l’Editor si aspetta di poter trattare gli oggetti di base e quelli composti in modo uniforme, nel senso che i comandi di Copy, Paste, ecc. dovrebbero poter essere applicabili sia a linee (circonferenze, quadrati, …) che a pictures. Inoltre l’introduzione di un nuovo oggetto elementare (es. finestre di testo) non dovrebbe comportare la riprogettazione dell’Editor grafico.
Abbiamo quindi i seguenti 2 obiettivi:


  • rendere l’accesso dall’esterno indifferente all’accesso dei vari livelli gerarchici;

  • rendere la struttura insensibile all’inserimento e alla cancellazione di parti.

Osservando il diagramma delle istanze sembra che un possibile diagramma delle classi possa essere il seguente:



Figura 3 - diag03.gif


Si noti che la notazione usata (in OMT o UML) è quella dell’aggregazione:



Figura 4 - diag04.gif


Tuttavia questo modello non soddisfa i due obiettivi che ci siamo proposti.

Potremmo allora pensare di permettere al Client di accedere direttamente alle classi.



Figura 5 - diag05.gif

Questo modello, pur funzionando, ha però dei limiti:


  • gli elementi composti (pictures) non possono essere trattati come quelli di base (es. linee);

  • l’inserimento di nuove sottoclassi (es. finestre di testo) comporta la riprogettazione del modello;

  • questa soluzione non permette di aggregare elementi composti in un elemento composto più complesso (picture di picture);

  • il controllo dei tipi è affidato all’implementazione.

Occorre, quindi, rivedere il progetto.

Per trattare gli elementi composti come vengono trattati quelli di base, occorre mettere circonferenze, linee, ecc. sullo stesso livello gerarchico delle pictures. Questo passo e` detto astrazione: che cosa accomuna linee, cerchi e pictures? Dobbiamo introdurre una nuova classe astratta Graph, progenitrice delle altre classi le cui primitive (Draw, Move) sono pure, cioè non implementate.



Figura 6 - diag06.gif


Graph e` astratta, perciò, nella notazione UML, essa viene scritta, assieme alle sue primitive pure, in corsivo. Non esistono quindi istanze di Graph.

La picture è libera di non conoscere i suoi children perché è stato introdotto un ArrayOfGraph.

L’inserimento di nuove sottoclassi non comporta la riprogettazione del modello.

La rappresentazione interna del tipo non interessa più al Client che non ha bisogno di sapere com’è fatta una circonferenza, ad esempio, ma si limita ad usare la classe Circle attraverso la sua interfaccia.

Il pattern Composite generico è dunque il seguente:



Figura 7 - diag07.gif

Vediamo un altro problema che può essere risolto usando il pattern Composite:
Un Simulatore di circuiti elettrici permette di disegnare circuiti elettrici a partire da componenti elementari che sono le resistenze, i condensatori e le induttanze. Essi possono essere connessi fra loro in parallelo o in serie. La serie o il parallelo di componenti sono impedenze. Se colleghiamo due impedenze tra di loro in serie otteniamo ancora un’impedenza. L’analogo vale per il parallelo. Il circuito può essere visto come una impedenza formata da altre impedenze.
Consideriamo un Simulatore di circuiti elettrici che disponga solo di resistenze e di condensatori.

Dati i seguenti circuiti disegniamo il loro diagramma a istanze e il diagramma delle classi del Simulatore.


F
igura 8 - diag08.wmf

Figura 9 - diag09.gif

Con questa soluzione abbiamo supposto che i tipi di connessione possibili siano solo serie e parallelo.

Qualora fosse necessario introdurre ulteriori tipi di connessione potrebbe essere utile riunire i tipi di connessione in una classe astratta Connessione. Facendo questa scelta il calcolo dell’impedenza viene effettuato solo al livello di gerarchia di serie e parallelo. Tale approccio è tipico della metodologia object-oriented con la quale vengono rimandate le scelte il più tardi possibile.


F
igura 10 - diag10.gif




Condividi con i tuoi amici:
  1   2   3   4   5   6   7


©astratto.info 2017
invia messaggio

    Pagina principale