Difference between revisions of "Template Method Pattern (padrão de desenho)"

From Wiki**3

(Terceiro Cenário: Aplicação do Padrão Template Method)
 
(10 intermediate revisions by the same user not shown)
Line 1: Line 1:
Material correspondente à aula 25.
+
{{NAVPO}}
 
+
{{TOCright}}
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" 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.
  
 
==Estrutura==
 
==Estrutura==
Line 9: Line 9:
 
[[Image:templatemethod-dpcd.png|400px]]
 
[[Image:templatemethod-dpcd.png|400px]]
  
==Exemplo==
+
==Exemplos==
 
 
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''.
 
 
 
=== Situação Inicial ===
 
 
 
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.
 
  }
 
 
 
=== Segundo Cenário: Abstracção de Características Comuns ===
 
 
 
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 ===
 
 
 
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).
 
 
 
  public abstract class BebidaQuente {
 
    abstract void infundir();
 
    abstract void condimentar();
 
 
 
    void preparar() {
 
      ferverÁgua();
 
      infundir();
 
      despejarNaChávena();
 
      condimentar();
 
    }
 
 
 
    void ferverÁgua()        { /* faz coisas */ }
 
    void despejarNaChávena() { /* faz coisas */ }
 
  }
 
  
  class Café extends BebidaQuente {
+
* [[Template Method: Bebida Quente (exemplo)|Preparação de bebida quente]]
    // void juntarGrãosMoídos() { /* faz coisas */ }
+
* [[Template Method: Génios da Lâmpada (exemplo)|Génios da lâmpada]]
    // void juntarAçúcar()     { /* faz coisas */ }
 
    public void infundir()    { /* juntar grãos moídos */ }
 
    public void condimentar() { /* juntar açúcar      */ }
 
  }
 
  
  class Chá extends BebidaQuente {
+
A chamada pela superclasse de métodos definidos nas subclasses é uma aplicação do chamado "Hollywood Principle", i.e., "don't call us, we'll call you".
    // void juntarFolhas() { /* faz coisas */ }
 
    // void juntarLimão()  { /* faz coisas */ }
 
    public void infundir()    { /* juntar folhas */ }
 
    public void condimentar() { /* juntar limão  */ }
 
  }
 
  
 +
[[category:Ensino]]
 
[[category:PO]]
 
[[category:PO]]

Latest revision as of 14:03, 19 November 2015

Programação com Objectos
Introduction
Creation and Destruction
Inheritance & Composition
Abstraction & Polymorphism
Code Organization
Java Topics
Inner Classes
Enumerations
Data Structures
Exceptions
Input/Output
RTTI
Other Topics
JUnit Tests
UML Topics
Design Patterns
"Simple" Factory
Composite & Visitor
Command
Strategy & State
Template Method
Observer
Abstract Factory
Decorator & Adapter
Façade (aka Facade)

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.

Estrutura

O padrão template method tem a seguinte estrutura de classes:

Templatemethod-dpcd.png

Exemplos

A chamada pela superclasse de métodos definidos nas subclasses é uma aplicação do chamado "Hollywood Principle", i.e., "don't call us, we'll call you".