Skip to content

Instantly share code, notes, and snippets.

@picodotdev
Last active December 21, 2015 15:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save picodotdev/6329908 to your computer and use it in GitHub Desktop.
Save picodotdev/6329908 to your computer and use it in GitHub Desktop.
package es.com.blogspot.elblogdepicodev.pattern.state.compraState;
import java.math.BigDecimal;
import java.text.MessageFormat;
import es.com.blogspot.elblogdepicodev.pattern.state.Compra;
import es.com.blogspot.elblogdepicodev.pattern.state.Compra.FormaEnvio;
import es.com.blogspot.elblogdepicodev.pattern.state.Compra.FormaPago;
public abstract class AbstractCompraState implements CompraState {
private Compra compra;
public AbstractCompraState(Compra compra) {
this.compra = compra;
}
public Compra getCompra() {
return compra;
}
@Override
public void comprar(BigDecimal precio, FormaPago formaPago, FormaEnvio formaEnvio) {
throw new IllegalStateException(MessageFormat.format("La compra en estado {0} no puede comprarse", compra.getEstado().getClass().getSimpleName()));
}
@Override
public void verificar() {
throw new IllegalStateException(MessageFormat.format("La compra en estado {0} no puede verificarse", compra.getEstado().getClass().getSimpleName()));
}
@Override
public void cancelar() {
throw new IllegalStateException(MessageFormat.format("La compra en estado {0} no puede cancelarse", compra.getEstado().getClass().getSimpleName()));
}
@Override
public void enviar() {
throw new IllegalStateException(MessageFormat.format("La compra en estado {0} no puede enviarse", compra.getEstado().getClass().getSimpleName()));
}
}
package es.com.blogspot.elblogdepicodev.pattern.state.compraState;
import es.com.blogspot.elblogdepicodev.pattern.state.Compra;
public class CanceladaCompraState extends AbstractCompraState {
public CanceladaCompraState(Compra compra) {
super(compra);
}
}
package es.com.blogspot.elblogdepicodev.pattern.state;
import java.math.BigDecimal;
import es.com.blogspot.elblogdepicodev.pattern.state.CompraStateFactory.Estado;
import es.com.blogspot.elblogdepicodev.pattern.state.compraState.CompraState;
public class Compra {
public enum FormaPago {
PAYPAL, TARJETA_CREDITO
}
public enum FormaEnvio {
UPS, TNT, SEUR
}
private CompraState estado;
private BigDecimal precio;
private FormaPago formaPago;
private FormaEnvio formaEnvio;
public Compra() {
setEstado(Estado.CREADA);
}
public CompraState getEstado() {
return estado;
}
public void setEstado(CompraState estado) {
this.estado = estado;
}
public void setEstado(Estado estado) {
this.estado = CompraStateFactory.buildState(estado, this);
}
public BigDecimal getPrecio() {
return precio;
}
public void setPrecio(BigDecimal precio) {
this.precio = precio;
}
public FormaPago getFormaPago() {
return formaPago;
}
public void setFormaPago(FormaPago formaPago) {
this.formaPago = formaPago;
}
public FormaEnvio getFormaEnvio() {
return formaEnvio;
}
public void setFormaEnvio(FormaEnvio formaEnvio) {
this.formaEnvio = formaEnvio;
}
}
package es.com.blogspot.elblogdepicodev.pattern.state.compraState;
import java.math.BigDecimal;
import es.com.blogspot.elblogdepicodev.pattern.state.Compra.FormaEnvio;
import es.com.blogspot.elblogdepicodev.pattern.state.Compra.FormaPago;
public interface CompraState {
void comprar(BigDecimal precio, FormaPago formaPago, FormaEnvio formaEnvio);
void verificar();
void cancelar();
void enviar();
}
package es.com.blogspot.elblogdepicodev.pattern.state;
import es.com.blogspot.elblogdepicodev.pattern.state.compraState.CanceladaCompraState;
import es.com.blogspot.elblogdepicodev.pattern.state.compraState.CompraState;
import es.com.blogspot.elblogdepicodev.pattern.state.compraState.CreadaCompraState;
import es.com.blogspot.elblogdepicodev.pattern.state.compraState.EnEsperaCompraState;
import es.com.blogspot.elblogdepicodev.pattern.state.compraState.EnviadaCompraState;
import es.com.blogspot.elblogdepicodev.pattern.state.compraState.VerificadaCompraState;
public class CompraStateFactory {
public enum Estado {
CREADA, EN_ESPERA, VERIFICADA, CANCELADA, ENVIADA
}
public static CompraState buildState(Estado estado, Compra compra) {
CompraState cs = null;
switch (estado) {
case CREADA:
cs = new CreadaCompraState(compra);
break;
case EN_ESPERA:
cs = new EnEsperaCompraState(compra);
break;
case VERIFICADA:
cs = new VerificadaCompraState(compra);
break;
case CANCELADA:
cs = new CanceladaCompraState(compra);
break;
case ENVIADA:
cs = new EnviadaCompraState(compra);
break;
default:
throw new IllegalArgumentException();
}
return cs;
}
}
package es.com.blogspot.elblogdepicodev.pattern.state.compraState;
import java.math.BigDecimal;
import es.com.blogspot.elblogdepicodev.pattern.state.Compra;
import es.com.blogspot.elblogdepicodev.pattern.state.Compra.FormaEnvio;
import es.com.blogspot.elblogdepicodev.pattern.state.Compra.FormaPago;
import es.com.blogspot.elblogdepicodev.pattern.state.CompraStateFactory.Estado;
public class CreadaCompraState extends AbstractCompraState {
public CreadaCompraState(Compra compra) {
super(compra);
}
@Override
public void comprar(BigDecimal precio, FormaPago formaPago, FormaEnvio formaEnvio) {
getCompra().setPrecio(precio);
getCompra().setFormaPago(formaPago);
getCompra().setFormaEnvio(formaEnvio);
getCompra().setEstado(Estado.EN_ESPERA);
}
@Override
public void cancelar() {
getCompra().setEstado(Estado.CANCELADA);
}
}
package es.com.blogspot.elblogdepicodev.pattern.state.compraState;
import es.com.blogspot.elblogdepicodev.pattern.state.Compra;
import es.com.blogspot.elblogdepicodev.pattern.state.CompraStateFactory.Estado;
public class EnEsperaCompraState extends AbstractCompraState {
public EnEsperaCompraState(Compra compra) {
super(compra);
}
@Override
public void verificar() {
getCompra().setEstado(Estado.VERIFICADA);
}
@Override
public void cancelar() {
getCompra().setEstado(Estado.CANCELADA);
}
}
package es.com.blogspot.elblogdepicodev.pattern.state.compraState;
import es.com.blogspot.elblogdepicodev.pattern.state.Compra;
public class EnviadaCompraState extends AbstractCompraState {
public EnviadaCompraState(Compra compra) {
super(compra);
}
}
$ git clone git://github.com/picodotdev/elblogdepicodev.git
$ cd elblogdepicodev/PatronState
$ ./gradlew test
package es.com.blogspot.elblogdepicodev.pattern.state.compraState;
import es.com.blogspot.elblogdepicodev.pattern.state.Compra;
import es.com.blogspot.elblogdepicodev.pattern.state.CompraStateFactory.Estado;
public class VerificadaCompraState extends AbstractCompraState {
public VerificadaCompraState(Compra compra) {
super(compra);
}
@Override
public void enviar() {
getCompra().setEstado(Estado.ENVIADA);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment