Análise e Projeto Orientados  
por Objetos  
Aula 12 – Padrões GoF (State e Strategy)  
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  
State  
•
•
Intenção: criar um objeto que exibe um comportamento  
diferente quando seu estado interno muda, fazendo o objeto  
parecer ter mudado a classe em tempo de execução.  
Solução: separar o estado dependente do comportamento do  
objeto original e alocar este comportamento para um série de  
outros objetos, um para cada estado.  
–
Estes objetos estado têm apenas responsabilidade relacionadas ao  
comportamento do respectivo estado.  
State  
State – Exemplo  
State – Implementação  
public interface State  
{
public void doAction(Context context);  
}
public class StartState implements State  
{
public void doAction(Context context)  
{
System.out.println("Player is in start state");  
context.setState(this);  
}
public String toString()  
{
return "Start State";  
}
}
State – Implementação  
public class StopState implements State  
{
public void doAction(Context context)  
{
System.out.println("Player is in stop state");  
context.setState(this);  
}
public String toString()  
{
return "Stop State";  
}
}
State – Implementação  
public class Context  
{
private State state;  
public Context()  
{
state = null;  
}
public void setState(State state)  
{
this.state = state;  
}
public State getState()  
{
return state;  
}
}
State – Implementação  
public static void main(String[] args)  
{
Context context = new Context();  
StartState startState = new StartState();  
startState.doAction(context);  
System.out.println(context.getState().toString());  
StopState stopState = new StopState();  
stopState.doAction(context);  
System.out.println(context.getState().toString());  
}
State – Aplicabilidade  
•
•
•
•
O objeto tem comportamento complexo que deve ser  
dividido em elementos menos complexos.  
Uma ou mais operações têm comportamento que muda de  
acordo com o estado do objeto.  
Facilita modificação do comportamento do estado, em  
particular a adição de estados extras.  
Transições de estado são explícitas.  
Strategy  
•
•
Intenção: permitir que o comportamento de uma classe ou o  
seu algoritmo possa ser alterado em tempo de execução.  
Solução: fornecer diferentes implementações de um  
algoritmo para uma classe cliente, a qual usa a  
implementação mais adequada em um dado instante.  
Strategy  
Strategy – Exemplo  
Strategy – Implementação  
public interface Strategy  
{
public int doOperation(int num1, int num2);  
}
public class OperationAdd implements Strategy  
{
@Override  
public int doOperation(int num1, int num2){  
return num1 + num2;  
}
}
public class OperationSubstract implements Strategy  
{
@Override  
public int doOperation(int num1, int num2){  
return num1 - num2;  
}
}
Strategy – Implementação  
public class OperationMultiply implements Strategy  
{
@Override  
public int doOperation(int num1, int num2){  
return num1 * num2;  
}
}
public class Context  
{
private Strategy strategy;  
public Context(Strategy strategy){  
this.strategy = strategy;  
}
public int executeStrategy(int num1, int num2){  
return strategy.doOperation(num1, num2);  
}
}
Strategy – Implementação  
public static void main(String[] args)  
{
Context context = new Context(new OperationAdd());  
System.out.println("10 + 5 = " + context.executeStrategy(10, 5));  
context = new Context(new OperationSubstract());  
System.out.println("10 - 5 = " + context.executeStrategy(10, 5));  
context = new Context(new OperationMultiply());  
System.out.println("10 * 5 = " + context.executeStrategy(10, 5));  
}
Strategy – Aplicabilidade  
•
•
Aplicável em situações nas quais é necessário trocar  
dinamicamente o algoritmo a ser usado em uma aplicação.  
Quando se necessita de uma classe que trate de modos  
diferentes os dados submetidos a ela.