Análise e Projeto Orientados  
por Objetos  
Aula 07 – Padrões GoF (Command e Template  
Method)  
Edirlei Soares de Lima  
<edirlei@iprj.uerj.br>  
Padrões GoF  
•
Criação:  
•
Estruturais:  
• Comportamentais:  
–
–
–
–
–
Abstract Factory  
Builder  
Factory Method  
Prototype  
Singleton  
–
–
–
–
–
–
–
Adapter  
Bridge  
– Chain of Responsibility  
– Command  
– Interpreter  
– Iterator  
– Mediator  
– Memento  
Composite  
Decorator  
Façade  
Flyweight  
Proxy  
– Observer  
–
–
–
–
State  
Strategy  
Template Method  
Visitor  
Command  
•
•
Intenção: associar uma ação a diferentes objetos  
através de uma interface conhecida. Permitir que  
objetos deste tipos tenham tais ações executadas  
sem que conheçamos o tipo de tais objetos ou a  
natureza das ações.  
Solução: encapsular uma requisição como um  
objeto, permitindo a parametrização de clientes com  
diferentes requisições.  
Command  
Command – Exemplo  
Command – Implementação  
public interface Order  
{
void execute();  
}
public class Stock {  
private String name = "ABC";  
private int quantity = 10;  
public void buy(){  
System.out.println("Stock [ Name: "+name+",  
Quantity: " + quantity +" ] bought");  
}
public void sell(){  
System.out.println("Stock [ Name: "+name+",  
Quantity: " + quantity +" ] sold");  
}
}
Command – Implementação  
public class BuyStock implements Order {  
private Stock abcStock;  
public BuyStock(Stock abcStock){  
this.abcStock = abcStock;  
}
public void execute(){  
abcStock.buy();  
}
}
public class SellStock implements Order {  
private Stock abcStock;  
public SellStock(Stock abcStock){  
this.abcStock = abcStock;  
}
public void execute() {  
abcStock.sell();  
}
}
Command – Implementação  
public class Broker  
{
private List<Order> orderList = new ArrayList<Order>();  
public void takeOrder(Order order)  
{
orderList.add(order);  
}
public void placeOrders()  
{
for (Order order : orderList)  
{
order.execute();  
}
orderList.clear();  
}
}
Command – Implementação  
public static void main(String[] args)  
{
Stock abcStock = new Stock();  
BuyStock buyStockOrder = new BuyStock(abcStock);  
SellStock sellStockOrder = new SellStock(abcStock);  
Broker broker = new Broker();  
broker.takeOrder(buyStockOrder);  
broker.takeOrder(sellStockOrder);  
broker.placeOrders();  
}
Command – Consequências  
•
•
•
Isola requisitante do executor;  
Permite registro (log) de ações;  
Permite execução em instante posterior à requisição;  
–
Enfileirar ações para processamento em outro momento.  
Template Method  
•
•
Intenção: definir o esqueleto de um algoritmo em uma  
operação, postergando (delegando) a definição de alguns  
passos desse algoritmo para subclasses.  
Solução:  
–
Em uma classe X, definir a parte invariável do algoritmo  
em uma operação. Essa operação é denominada método  
template (template method).  
–
–
Nesta mesma operação, fazer chamadas a operações que  
representam a parte variável do algoritmo.  
Essas operações devem então ser implementadas pelas  
subclasses de X.  
Template Method  
Template Method – Exemplo  
Template Method – Implementação  
public abstract class Game  
{
abstract void initialize();  
abstract void startPlay();  
abstract void endPlay();  
public final void play()  
{
initialize();  
startPlay();  
endPlay();  
}
}
Template Method – Implementação  
public class Cricket extends Game  
{
@Override  
void endPlay()  
{
System.out.println("Cricket Game Finished!");  
}
@Override  
void initialize()  
{
System.out.println("Cricket Game Initialized! Start playing.");  
}
@Override  
void startPlay()  
{
System.out.println("Cricket Game Started. Enjoy the game!");  
}
}
Template Method – Implementação  
public class Football extends Game  
{
@Override  
void endPlay()  
{
System.out.println("Football Game Finished!");  
}
@Override  
void initialize()  
{
System.out.println("Football Game Initialized! Start playing.");  
}
@Override  
void startPlay()  
{
System.out.println("Football Game Started. Enjoy the game!");  
}
}
Template Method – Implementação  
public static void main(String[] args)  
{
Game game = new Cricket();  
game.play();  
game = new Football();  
game.play();  
}
Template Method – Aplicabilidade  
•
•
Quando queremos implementar partes invariáveis de um  
algoritmo e deixar que as subclasses implementem os  
comportamentos variáveis;  
Quando comportamentos comuns entre subclasses devem  
ser fatorados e localizados em uma superclasse comum;  
–
Evitando assim duplicação de código;  
•
•
Quando queremos controlar a extensão das subclasses;  
Permite que as subclasses redefinam certos passos de um  
algoritmo sem mudar a estrutura desse algoritmo.