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.
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.
• 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