Composite (padrão de desenho): Difference between revisions

From Wiki**3

Line 16: Line 16:
Uma implementação simples, definiria na implementação do conceito ''empregada'' as referências para os objectos que representam as ementas.
Uma implementação simples, definiria na implementação do conceito ''empregada'' as referências para os objectos que representam as ementas.


  CÓDIGO
  <B>public</B> <B>class</B> Empregada0 {
  Ementa _ementaPequenoAlmo&ccedil;o;
  Ementa _ementaAlmo&ccedil;o;
  Ementa _ementaLanche;
    <B>public</B> <FONT COLOR="#000080">Empregada0</FONT>(Ementa ementaPequenoAlmo&ccedil;o, Ementa ementaAlmo&ccedil;o,
                      Ementa ementaLanche) {
      _ementaPequenoAlmo&ccedil;o = ementaPequenoAlmo&ccedil;o;
      _ementaAlmo&ccedil;o = ementaAlmo&ccedil;o;
      _ementaLanche = ementaLanche;
    }
    <B>public</B> <FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">printMenu</FONT>() {
      <FONT COLOR="#000080">printMenu</FONT>(ementaAlmo&ccedil;o);
      <FONT COLOR="#000080">printMenu</FONT>(ementaLanche);
    }
    <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%n    </FONT><FONT COLOR="#dd0000">-- </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>());
    }
  }


Esta situação conduz a inflexibilidade na manutenção: por exemplo, a adição de novas refeições implica a alteração das empregadas!
Esta situação conduz a inflexibilidade na manutenção: por exemplo, a adição de novas refeições implica a alteração das empregadas!

Revision as of 22:45, 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.

CÓDIGO

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