State: diferenças entre revisões

8 bytes removidos ,  20h44min de 24 de junho de 2018
m
ajustes usando script
m (ajustes usando script)
[[FileImagem: StateColorido.jpg | right | Diagrama UML Pattern Design State]]
'''''State''''' é um [[padrão de projeto de software]] usado quando o comportamento de um objeto muda, dependendo do seu estado.
 
O seguinte diagrama é uma representação da estrutura e relações das classes que servem de modelo para os objetos.
 
[[FileImagem:LibroActualizado.jpg| center | Diagrama UML, ejemplo Padrão State]]
 
=== Diagrama de Estados ===
 
No seguinte diagrama representamos os possíveis estados ou situações em que um Livro pode se encontrar no decorrer da execução em nosso sistema.
 
[[FileImagem:EstadosState.jpg| center | Diagrama de Estados em UML, ejemplo Padrão State]]
 
== Problema ==
* Aumenta o número de subclasses.
 
== Implementação (Java) ==
<source lang="java5">
public class Main {
 
<source lang="java5">
/**
* Livro define o contexto para este exemplo simples de padrão estado.
* Um Livro pode estar em dois estados: Disponível ou Emprestado, de modo que
* se escolhermos por representar o estado com um atributo, os métodos da
* classe Livro acabariam por converter-se em condicionais sobre esse estado.
*/
}
 
// Este método modifica o estado do livro. Problema: o método deve
// ser acessado a partir de uma classe externa (EstadoLivro), o que exclui
// a visibilidade private e protected. public é demasiado geral pois
// *todas* as classes podem acessar o método. Neste caso, sugere-se a
// visibilidade de package, com Livro e os seus estados no mesmo package.
 
// Os métodos de dependentes do estado delegam o comportamento
// definido para cada estado. Uma vez que vamos dar aos estados
// a responsabilidade de realizar as transições, passamos o livro
// ao estado para que possa, se lhe interessar, chamar estabelecerEstado.
 
this.estado.devolver(this);
}
 
public boolean solicitar() {
return this.estado.solicitar(this);
protected Disponivel() {}
 
public static Disponivel instancia() {
if (this.instancia == null)
this.instancia = new Disponivel();
 
return this.instancia;
}
 
protected Emprestado() {}
 
public static Emprestado instancia() {
if (this.instancia == null)
this.instancia = new Emprestado();
 
return this.instancia;
}