terça-feira, 9 de novembro de 2010

State Pattern




Definição

O State pattern permite que um objeto altere seu comportamento quando seu estado Interno muda. Esta é uma maneira limpa de um objeto mudar parcialmente o seu tipo em tempo de execução. O objeto parecerá ter mudado sua classe.

Quando usar

• Quando precisamos definir um "contexto" da classe para apresentar uma interface única para o mundo exterior.
• Quando queremos representar diferentes "estados" de uma máquina  como as classes derivadas da classe base do estado.

Benefícios

• Código de limpeza, quando cada estado é uma classe em vez disso.
• Use uma classe para representar um estado e não uma constante.

Desvantagens / consequências

• Gera um número de objetos de classe pequena, mas no processo, simplifica
e esclarece o programa.
• Elimina a necessidade de um conjunto de longas  demonstrações condicionalde  sósia espalhados por todo o código.




Exemplo

Este exemplo tem dois estados. StateA escreve o nome em minúsculas e  StateB as maiúsculas. Começamos em um estado e depois mudamos para o  estado B, onde ficamos por duas chamadas para writeName antes de mudar de volta ao estado A. 

public interface State {
public void writeName(StateContext stateContext, String name);
}

public class StateA implements State {

public void writeName(StateContext stateContext, String name) {
System.out.println(name.toLowerCase());
stateContext.setState(new StateB());
}
}

public class StateB implements State {
private int count=0;

public void writeName(StateContext stateContext, String name){
System.out.println(name.toUpperCase());
if(++count>1) {
stateContext.setState(new StateA());
}
}
}




public class StateContext {
private State myState;

public StateContext() {
setState(new StateA());
}

public void setState(State stateName) {
this.myState = stateName;
}

public void writeName(String name) {
this.myState.writeName(this, name);
}
}

public class TestClientState {
public static void main(String[] args) {
StateContext sc = new StateContext();
sc.writeName("Monday");
sc.writeName("Tuesday");
sc.writeName("Wednesday");
sc.writeName("Thursday");
sc.writeName("Saturday");
sc.writeName("Sunday");
}
}

Quando TestClientState é executado o resultado é:
monday
TUESDAY
WEDNESDAY
thursday
SATURDAY
SUNDAY

Exemplo de uso

Considere um aplicativo de desenho com diversas ferramentas como selecionar, retângulo, círculo, preencher e clarear. Cada  ferramenta se comporta de uma maneira diferente quando você clica ou arrasta o mouse pela tela. O estado do editor afeta  o comportamento que o programa deve exibir. Existem algumas atividades do mouse que precisam ser tratadas.

public class DrawState {
public void mouseDown(int x, int y) {}
public void mouseUp(int x, int y) {}
public void mouseDrag(int x, int y) {}
}

Cada um dos estados que implementar um ou mais desses diferentes métodos.

public class Rectangle extends DrawState {
//create a new Rectangle where mouse clicks
public void mouseDown(int x, int y) {
canvas.addDrawing(new visRectangle(x, y));
}
}


Nenhum comentário:

Postar um comentário