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.


  CÓDIGO
  <B>public</B> <B>class</B> Empregada1 {
   
    <B><FONT COLOR="#0095ff">ArrayList</FONT></B>&lt;Ementa&gt; _ementas;
    <B>public</B> <FONT COLOR="#000080">Empregada1</FONT>(<B><FONT COLOR="#0095ff">ArrayList</FONT></B>&lt;Ementa&gt; 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">&quot;</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">&quot;</FONT>, item.nome(),
                          item.<FONT COLOR="#000080">pre&ccedil;o</FONT>(), item.<FONT COLOR="#000080">descri&ccedil;&atilde;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:

Composite-dpcd.png

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