(→Exemplo) |
(→Segundo Cenário: Abstracção de Características Comuns) |
||
Line 47: | Line 47: | ||
Nesta situação abstrairam-se algumas das caracterÃsticas comuns e procurou-se reutilizar o máximo de funcionalidade. Note-se que, ainda assim, há repetição da estrutura do "algoritmo" de aquecimento. | Nesta situação abstrairam-se algumas das caracterÃsticas comuns e procurou-se reutilizar o máximo de funcionalidade. Note-se que, ainda assim, há repetição da estrutura do "algoritmo" de aquecimento. | ||
+ | public abstract class BebidaQuente { | ||
+ | abstract void preparar(); | ||
+ | |||
+ | void ferverÃgua() { /* faz coisas */ } | ||
+ | void despejarNaChávena() { /* faz coisas */ } | ||
+ | } | ||
+ | |||
+ | public class Café extends BebidaQuente { | ||
+ | |||
+ | void juntarGrãosMoÃdos() { /* faz coisas */ } | ||
+ | void juntarAçúcar() { /* faz coisas */ } | ||
+ | |||
+ | void preparar() { /* como antes */ } | ||
+ | } | ||
+ | |||
+ | public class Chá extends BebidaQuente { | ||
+ | |||
+ | void juntarFolhas() { /* faz coisas */ } | ||
+ | void juntarLimão() { /* faz coisas */ } | ||
+ | |||
+ | void preparar() { /* como antes */ } | ||
+ | } | ||
=== Terceiro Cenário: Aplicação do Padrão Template Method === | === Terceiro Cenário: Aplicação do Padrão Template Method === |
Material correspondente à aula 25.
O padrão "template method" corresponde à definição do esqueleto de um algoritmo de uma operação em que alguns passos são delegados em subclasses. O padrão permite que as subclasses redefinam partes do algoritmo sem a estrutura do algoritmo seja alterada.
O padrão template method tem a seguinte estrutura de classes:
Este exemplo aplica o padrão ao "problema" de preparação de uma bebida quente.
Este exemplo mostra a evolução de uma aplicação à medida que são aplicadas técnicas de programação com objectos, em que se refactoriza algum código, e de aplicação de padrões, neste caso, o template method.
Na situação inicial há repetição de código e não há abstracção de conceitos comuns nem, por isso, reutilização.
public class Café { void preparar() { ferverÃgua(); juntarGrãosMoÃdos(); despejarNaChávena(); juntarAçúcar(); } // &c. }
public class Chá { void preparar() { ferverÃgua(); juntarFolhas(); despejarNaChávena(); juntarLimão(); } // &c. }
Nesta situação abstrairam-se algumas das caracterÃsticas comuns e procurou-se reutilizar o máximo de funcionalidade. Note-se que, ainda assim, há repetição da estrutura do "algoritmo" de aquecimento.
public abstract class BebidaQuente { abstract void preparar(); void ferverÃgua() { /* faz coisas */ } void despejarNaChávena() { /* faz coisas */ } }
public class Café extends BebidaQuente { void juntarGrãosMoÃdos() { /* faz coisas */ } void juntarAçúcar() { /* faz coisas */ } void preparar() { /* como antes */ } }
public class Chá extends BebidaQuente { void juntarFolhas() { /* faz coisas */ } void juntarLimão() { /* faz coisas */ } void preparar() { /* como antes */ } }
Manteve-se a abstracção conseguida no segundo cenário e aplicou-se o padrão template method. O resultado é o desaparecimento do algoritmo repetido: agora aparece apenas na superclasse e as partes dependentes das subclasses são definidas por cada uma. Note-se que a interface é agora imposta pela superclasse e que pode haver necessidade de renomear alguns dos métodos existentes (ou, alternativamente, de os chamar a partir dos que implementam a interface devida à aplicação do padrão).