Composite (padrão de desenho): Difference between revisions
From Wiki**3
Line 48: | Line 48: | ||
Uma possÃvel solução é definir as empregadas como tendo, não dois, três, ou um número concreto de ementas, mas sim como tendo a capacidade de gerir um número indeterminado (uma colecção) de ementas. | Uma possÃvel solução é definir as empregadas como tendo, não dois, três, ou um número concreto de ementas, mas sim como tendo a capacidade de gerir um número indeterminado (uma colecção) de ementas. | ||
<B>public</B> <B>class</B> Empregada1 { | |||
<B><FONT COLOR="#0095ff">ArrayList</FONT></B><Ementa> _ementas; | |||
<B>public</B> <FONT COLOR="#000080">Empregada1</FONT>(<B><FONT COLOR="#0095ff">ArrayList</FONT></B><Ementa> ementas) { | |||
_ementas = ementas; | |||
} | |||
<B>public</B> <FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">printMenu</FONT>() { | |||
<B>for</B> (Ementa ementa : _ementas) <FONT COLOR="#000080">printMenu</FONT>(ementa); | |||
} | |||
<B>public</B> <FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">printMenu</FONT>(Ementa ementa) { | |||
<B><FONT COLOR="#0095ff">System</FONT></B>.<FONT COLOR="#000080">out</FONT>.<FONT COLOR="#000080">println</FONT>(ementa.<FONT COLOR="#000080">nome</FONT>()); | |||
<B>for</B> (ItemEmenta item : ementa) | |||
<B><FONT COLOR="#0095ff">System</FONT></B>.<FONT COLOR="#000080">out.printf</FONT>(<FONT COLOR="#dd0000">"</FONT><FONT COLOR="#ff00ff">%s</FONT><FONT COLOR="#dd0000">, </FONT><FONT COLOR="#ff00ff">%s</FONT><FONT COLOR="#dd0000">%n -- </FONT><FONT COLOR="#ff00ff">%s%n</FONT><FONT COLOR="#dd0000">"</FONT>, item.nome(), | |||
item.<FONT COLOR="#000080">preço</FONT>(), item.<FONT COLOR="#000080">descrição</FONT>()); | |||
} | |||
} | |||
===Sobremesas ao Jantar=== | ===Sobremesas ao Jantar=== |
Revision as of 22:48, 15 November 2005
Material correspondente à aula 22.
O padrão composite organiza os objectos em árvores que representam hierarquias parte-todo. O uso do padrão permite que sejam tratados uniformemente os objectos e as suas composições.
Estrutura
O padrão composite tem a seguinte estrutura de classes:
Exemplo
Um restaurante tem empregadas que apresentam menus aos clientes. Cada empregada dispõe de várias ementas, consoante a hora do dia: assim, existem ementas para pequenos almoços, almoços e jantares, por exemplo.
A Empregada Básica
Uma implementação simples definiria na implementação do conceito empregada as referências para os objectos que representam as ementas.
public class Empregada0 { Ementa _ementaPequenoAlmoço; Ementa _ementaAlmoço; Ementa _ementaLanche; public Empregada0(Ementa ementaPequenoAlmoço, Ementa ementaAlmoço, Ementa ementaLanche) { _ementaPequenoAlmoço = ementaPequenoAlmoço; _ementaAlmoço = ementaAlmoço; _ementaLanche = ementaLanche; } public void printMenu() { printMenu(ementaAlmoço); printMenu(ementaLanche); } public void printMenu(Ementa ementa) { System.out.println(ementa.nome()); for (ItemEmenta item : ementa) System.out.printf("%s, %s%n -- %s%n", item.nome(), item.preço(), item.descrição()); } }
Esta situação conduz a inflexibilidade na manutenção: por exemplo, a adição de novas refeições implica a alteração das empregadas!
Refeições a todas as horas
Uma possÃvel solução é definir as empregadas como tendo, não dois, três, ou um número concreto de ementas, mas sim como tendo a capacidade de gerir um número indeterminado (uma colecção) de ementas.
public class Empregada1 { ArrayList<Ementa> _ementas; public Empregada1(ArrayList<Ementa> ementas) { _ementas = ementas; } public void printMenu() { for (Ementa ementa : _ementas) printMenu(ementa); } public void printMenu(Ementa ementa) { System.out.println(ementa.nome()); for (ItemEmenta item : ementa) System.out.printf("%s, %s%n -- %s%n", item.nome(), item.preço(), item.descrição()); } }
Sobremesas ao Jantar
Mas o que aconteceria se se quisesse adicionar uma outra ementa apenas a uma das refeições? Por exemplo, adicionar uma ementa de sobremesas ou uma carta de vinhos à ementa do jantar. A solução anterior não tem limitações ao número de ementas que uma empregada pode gerir. No entanto, adicionar uma ementa à colecção não a associa de forma alguma à ementa do jantar: seria necessário alterar o código da empregada para fazer tal associação: uma situação indesejável. A solução passa por utilizar o padrão de composição (composite): por um lado a ementa do jantar vai ter uma outra ementa como se fosse mais uma entrada, por outro a empregada trata a ementa do jantar como sempre fez (i.e., sem alterações).
CÓDIGO