Dev (Back & Front)ARTIGO

Design Pattern não é receita de bolo – Parte 03: State

Hoje veremos o design pattern chamado State. Em poucas palavras, ele é baseado no comportamento do objeto. Se o comportamento foi alterado para Y, então a forma de trabalho desse objeto é Y. Vamos ver colocando a mão na massa, acho que será mais produtivo.

Let’s go…

State

É um padrão comportamental do design pattern. Ele é focado em saber se o estado de um objeto foi alterado. Ou seja, o State permite alterar o comportamento de um objeto com base no estado atual.
Se o taxímetro é bandeira 1, o cálculo é feito de maneira X, com valores Y, mas se o estado atual saiu de bandeira 1 e foi para bandeira 2, o cálculo é feito de maneira  X com valor Z.

O diagrama acima mostra como as classes se entendem.

Na prática

Agora vamos conhecer praticando e, como sempre, código no modo didático para ajudar quem está vendo o assunto pela primeira vez. A seguir, nosso projeto:
Bandeira.java

Criaremos inicialmente a interface state, que é a Bandeira.

package br.com.camilolopes.interfaces.state;

public interface Bandeira {
double calculoBandeira(double distancia);
}

BandeiraXX.java

As classes Bandeira 1, Bandeira2.java são classes que implementam o State, ou seja, Bandeira 1 tem uma formula X de cálculo, a bandeira 2 também terá a forma dele calcular e assim sucessivamente.

package br.com.camilolopes.classes;

import br.com.camilolopes.interfaces.state.Bandeira;

public class Bandeira1 implements Bandeira {

@Override
public double calculoBandeira(double distancia) {
double total = distancia * 1.5 ;
return total;
}

}

Bandeira 2.java

package br.com.camilolopes.classes;

import br.com.camilolopes.interfaces.state.Bandeira;

public class Bandeira2 implements Bandeira {

@Override
public double calculoBandeira(double distancia) {
//não gosto muito desses number magic aqui, mas vou deixar por enquanto
double total = distancia * 3.0 + 1.0;
return total;
}

}

Taxímetro.java

Criamos o relacionamento entre o Taxímetro e a Bandeira, já que para o taxímetro existir é necessária uma bandeira.

package br.com.camilolopes.classes;

import br.com.camilolopes.interfaces.state.Bandeira;
/*
* classe que mantém referencia para um State com base no estado atual
*/
public class Taximetro {
/*um taximetro has-a bandeira
* ou seja, para um taximetro ter vida
* ele precisa estar associado com uma bandeira
*/
private Bandeira bandeira;

public Taximetro(Bandeira bandeira) {
super();
this.bandeira = bandeira;
}

public Bandeira getBandeira() {
return bandeira;
}

public void setBandeira(Bandeira bandeira) {
this.bandeira = bandeira;
}
//aqui o taximetro vai calcular c/ base no tipo de Bandeira
public double calculaCorrida(double distancia){
double totalCorrida = bandeira.calculoBandeira(distancia);
return totalCorrida;
}
}

TaximetroMain.java

import br.com.camilolopes.classes.Bandeira1;
import br.com.camilolopes.classes.Bandeira2;
import br.com.camilolopes.classes.Taximetro;

public class TaxiMain {

public static void main(String[] args) {
Bandeira1 bandeira1 = new Bandeira1();
Taximetro taximetro = new Taximetro(bandeira1);
taximetro.setBandeira(bandeira1);
System.out.println("Valor da corrida com bandeira 1: "+ taximetro.calculaCorrida(2.0));
taximetro.setBandeira(new Bandeira2());
System.out.println("O valor da corrida com bandeira 2: " + taximetro.calculaCorrida(2.0));
}
}

Feito isso, criamos uma classe main que vai nos ajudar a ver o resultado com base no tipo passado.

Resultado

A seguir, temos o resultado com a Bandeira 1 e 2. Observe que a distância passada foi a mesma, porém o resultado diferente, já que cada Bandeira tem um cálculo específico e o nosso Taxímetro sabe o que mostrar com base no estado da Bandeira (1,2,3…)
E esse é o design pattern state. Vou ficando por aqui e até o próximo post.

See ya!!

é Bacharel em Sistemas de Informação e Especialista em Gestão e Estratégia de Negócios. Trabalha com TI desde 2003 e possui as certificações SCJP 5 e SCM. Trabalhou na IBM Brasil como Analista Programador Java, passou pelo laboratório da Enterprise Computing Lab (ECL) HP como Software Engineer, Ci&T como Engenheiro de Software em projeto JEE. Tem experiência internacional em Índia, Dubai e Londres. Atualmente é cofundador da ITSLabs (www.itslabs.com.br), uma start-up focada na criação de produtos web e mobile para start-ups. Também é autor dos livros "Guia do Exame SCJP", "Guia Prático JEE com Frameworks" e "TDD na prática".

Ver perfil